我正在尝试使用Windows身份验证和自定义声明来实施基于策略的身份验证方案。一切都可以编译并正常运行,但是由于未知原因,授权仍然失败。这是我在做什么:
1-在startup.cs中,我们添加Windows auth作为身份验证方案,添加要求“ BASIC_USER”声明的“ BASIC_USER”策略,并注入声明转换器。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization(options =>
{
options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));
});
}
2-我们的声明转换器将每个请求的声明添加到ClaimsPrincipal。 (通常,这会根据数据驱动的角色添加声明,但为了简洁起见对其进行了编辑。)
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
Claim claim = new Claim(ClaimTypes.Role, "BASIC_USER");
((ClaimsIdentity)principal.Identity)
.AddClaim(claim);
return await Task.FromResult(principal);
}
}
3-我们用Authorize属性装饰控制器:
public class MyController : Controller
{
[Authorize(Policy = "BASIC_USER")]
public async Task<ActionResult> Get()
{
...
}
}
当我在上面的第1步和第2步时,一切似乎都井井有条-在启动时添加了策略,并在请求中添加了声明,但是控制器仍然返回格式正确的403。有没有办法调试授权过程,还是我在这里遗漏了一些明显的东西?
答案 0 :(得分:0)
事实证明这是由于疏忽造成的。这行:
options.AddPolicy("BASIC_USER", policy => policy.RequireClaim("BASIC_USER"));
应实际阅读:
options.AddPolicy("BASIC_USER", policy => policy.RequireClaim(ClaimTypes.Role, "BASIC_USER"));
声明类型必须与在TransformAsync中添加到主体的声明类型匹配。