Схема множественной аутентификации, включая клиентский сертификат и удостоверение пользователя - PullRequest
0 голосов
/ 04 июня 2019

После выполнения проверки подлинности Client Certificate X.509, как выполнить проверку подлинности Client Certificate-Id по таблице AspNetUsers в базе данных.

Если я ставлю SignInManager с OnValidateCertificate, он вызывается при каждом запросе, а SignInManager подписывает пользователя при каждом запросе.

Пожалуйста, посоветуйте, как вызвать SignInManager только один раз для аутентификации с AspNetUsers. Обратите внимание: идентификатор сертификата клиента хранится как имя пользователя в 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 голосов
/ 05 июня 2019

Согласно ответу Барри Дорранса снизу URL

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

О, интересно. Есть ли причина, по которой сертификат не может содержать информацию о пользователе, и вам нужно перейти в базу данных для замены сгенерированного участника? Идентификация не предназначена для использования вне аутентификации cookie.

Проблема, с которой вы здесь столкнулись, заключается в том, что да, проверка сертификата вызывается при каждом запросе. Это неприятный побочный эффект, связанный с попыткой сделать этот кросс-совместимый и настраиваемым в обычном стиле ядра asp.net.

Единственное, о чем я могу подумать, - это кэшировать информацию о пользователе, которую вы получаете из диспетчера входа в систему идентификации в redis или другом в кэше памяти, и использовать хэш sha256 необработанных данных сертификата в качестве ключа, а затем вы ' Я пропустил попадание в базу данных. Вы должны очистить кеш через некоторое время, если хотите отразить изменения курса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...