我将访问几个表以确定用户是否“已验证”,并将自定义角色添加到 Windows 身份验证用户以进行授权。现在我正在一个基本的 .net Core Web 应用程序中运行测试,只是为了看看我应该如何做。我在我的 Fallback Policy 和 ClaimsLoader 中设置了RequiredClaim,效果很好:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddTransient<IClaimsTransformation, ClaimsLoader>();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireClaim("ValidatedUser")
.Build();
});
}
public class ClaimsLoader : IClaimsTransformation
{
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var claimsIdentity = (ClaimsIdentity)principal.Identity;
claimsIdentity.AddClaim(new Claim("ValidatedUser", ""));
return await Task.FromResult(principal);
}
}
只要 AddClaim 行在那里,他们就可以访问该应用程序,没有它,他们会得到我想要的未经授权的响应。
根据我所阅读的内容,我认为我在转换中添加的任何声明/角色应该每次都回来,但他们没有。在上面的代码中,我每次都运行 AddClaim,因此它可以正常工作,但实际上我将去数据库以确定是否应该添加该声明,这是一个昂贵的过程。我想在多个请求中保留结果。因此,我想检查索赔是否已经存在,如果是,则不再打扰。无论出于何种原因,当它返回第二个请求时,它永远不会出现。
从我在 2.x 中读到的内容来看,声明应该持续存在: https ://philipm.at/2018/aspnetcore_claims_with_windowsauthentication.html
但在我的 3.1 应用程序中,它们没有。