包括客户端证书和身份用户在内的多种身份验证方案

时间:2019-06-04 19:43:45

标签: asp.net-core asp.net-identity client-certificates

在执行客户端证书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));
        });
    }

1 个答案:

答案 0 :(得分:0)

根据Barry Dorrans从以下网址获得的答复

https://github.com/blowdart/idunno.Authentication/issues/29

  

哦,有趣。证书为什么不能包含用户信息,您需要进入数据库来替换生成的主体?身份不应该在Cookie身份验证之外使用。

     

这里的问题是,是的,每次请求都会调用证书验证。试图使此交叉兼容并以常规的asp.net核心样式进行配置是不幸的副作用。

     

我唯一能想到的就是将从身份登录管理器中获取的用户信息缓存到redis或其他缓存中,并使用证书原始数据的sha256哈希作为密钥,然后d错过数据库命中。如果要反映过程的变化,则需要过一会儿清除缓存。