【发布时间】:2020-12-16 16:11:19
【问题描述】:
我正在尝试根据请求参数选择 openId 授权方案。
我添加了两个 openIdConnect 架构:
.AddOpenIdConnect("abc", abcHandler)
.AddOpenIdConnect("def", defHandler);
一开始我覆盖了整个授权中间件并挑战:
if (authorizeResult.Challenged)
{
if (valueFromQueryString.Contains("abc"))
{
await context.ChallengeAsync("abc");
}
else if (valueFromQueryString.Contains("def"))
{
await context.ChallengeAsync("def");
}
}
但后来我注意到有一些政策,所以尝试使用这些政策。我创建了我的要求,然后添加了两个具有如下架构的策略:
services.AddAuthorization(options =>
{
options.AddPolicy("abc", policy =>
{
policy.AuthenticationSchemes.Add("abc");
policy.Requirements.Add(new TenantSpecificRequirement("abc"));
policy.RequireAuthenticatedUser();
});
options.AddPolicy("def", policy =>
{
policy.AuthenticationSchemes.Add("def");
policy.Requirements.Add(new TenantSpecificRequirement("def"));
policy.RequireAuthenticatedUser();
});
});
我意识到策略必须像这样绑定到控制器:
[Authorize(Policy = "abc")]
[Authorize(Policy = "def")]
这完全不是我需要的。现在最好的办法是根据 url 动态地将策略分配给控制器,但这似乎是不可能的,因为在应用程序启动时没有添加控制器过滤器。
那么还有其他方法吗?
【问题讨论】:
标签: c# authorization identityserver4 idp