在执行客户端证书X.509身份验证之后,如何根据数据库中的AspNetUsers表对客户端证书ID进行身份验证。
如果我将SignInManager和OnValidateCertificate放在一起,则会在每个请求上调用它,并且SignInManager在每个请求上都对用户进行签名。
请告知如何仅一次调用SignInManager进行AspNetUsers身份验证。 请注意,客户端证书ID是作为用户名存储在AspNetUsers中的。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>()
.AddRoles<IdentityRole>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
options.Events = new CertificateAuthenticationEvents
{
OnValidateCertificate = context =>
{
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, context.ClientCertificate.Subject, ClaimValueTypes.String, context.Options.ClaimsIssuer),
new Claim(ClaimTypes.Name, context.ClientCertificate.Subject, ClaimValueTypes.String, context.Options.ClaimsIssuer)
};
context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
context.Success();
return Task.CompletedTask;
}
};
});
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
}
答案 0 :(得分:0)
根据Barry Dorrans从以下网址获得的答复
https://github.com/blowdart/idunno.Authentication/issues/29
哦,有趣。证书为什么不能包含用户信息,您需要进入数据库来替换生成的主体?身份不应该在Cookie身份验证之外使用。
这里的问题是,是的,每次请求都会调用证书验证。试图使此交叉兼容并以常规的asp.net核心样式进行配置是不幸的副作用。
我唯一能想到的就是将从身份登录管理器中获取的用户信息缓存到redis或其他缓存中,并使用证书原始数据的sha256哈希作为密钥,然后d错过数据库命中。如果要反映过程的变化,则需要过一会儿清除缓存。