Обработчик аутентификации в .NET Core 2.2 не может получить доступ к утверждениям, которые были установлены другим обработчиком аутентификации. - PullRequest
0 голосов
/ 02 июля 2019

У меня есть пользовательский обработчик аутентификации (AuthenticationHandler<TOptions>), который выполняет аутентификацию из пользовательского файла cookie.Этот файл cookie содержит идентификатор пользователя и другую информацию о пользователе.Таким образом, этот обработчик выполняет некоторую расшифровку с некоторой логикой для анализа cookie и извлечения всех данных.

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

protected async override Task<AuthenticateResult> HandleAuthenticateAsync()
{
    var allClaims = this.Context.User.Claims;
    var userId =    allClaims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
    var identity =  this.Context.User.Identities.FirstOrDefault();
    var claims2 = identity.claims;
    var userId2 =   identity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
}

allClaims count равно 0.userId - это null.identity от первого обработчика аутентификации, это не null.Но количество claims2 равно 0.

Позже я смогу увидеть все утверждения в контроллере.

Я мог бы продублировать логику дешифрования из первого обработчика, но это не правильно.

Так как мне получить доступ к утверждениямот другого обработчика во время этого процесса аутентификации?

1 Ответ

0 голосов
/ 03 июля 2019

В первом AuthenticationHandler вы должны создать заявки, поместить их в AuthenticationTicket и вернуть:

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{

    var claims = new[] { new Claim(ClaimTypes.Name, "nanyu") };
    var identity = new ClaimsIdentity(claims, Scheme.Name);
    var principal = new ClaimsPrincipal(identity);
    var ticket = new AuthenticationTicket(principal, Scheme.Name);
    return AuthenticateResult.Success(ticket);
}

Вы можете написать пользовательское промежуточное ПО, которое вручную вызывает AuthenticateAsync () и создает ClaimsPrincipal, содержащий все необходимые вам удостоверения:

app.UseAuthentication();
app.Use(async (context, next) =>
{
    var principal = new ClaimsPrincipal();

    var result1 = await context.AuthenticateAsync("MyScheme");
    if (result1?.Principal != null)
    {
        principal.AddIdentities(result1.Principal.Identities);
    }

    var result2 = await context.AuthenticateAsync("MyScheme2");
    if (result2?.Principal != null)
    {
        principal.AddIdentities(result2.Principal.Identities);
    }

    context.User = principal;

    await next();
});

Настройка аутентификации:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = "MyScheme";
    options.DefaultChallengeScheme = "MyScheme";
})
.AddCustomAuth(o => { }).AddCustomAuthTwo(o => { });

CustomAuthExtensions.cs:

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("MyScheme", "MyAuth", configureOptions);
    }
    public static AuthenticationBuilder AddCustomAuthTwo(this AuthenticationBuilder builder, Action<CustomAuthOptionsTwo> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptionsTwo, CustomAuthHandlerTwo>("MyScheme2", "MyAuth2", configureOptions);
    }
}
...