Как получить доступ к претензиям из HttpContext в. Net Core? - PullRequest
3 голосов
/ 27 апреля 2020

Используя приведенный ниже код для входа в систему с пользовательскими утверждениями, все работает нормально.

    private async Task SignInAsync(ApplicationUser user)
    {
        var claims = await _claimsPrincipalFactory.CreateAsync(user);

        claims.Identities.First().AddClaims(new[]
        {
            new Claim("xxx", "111"),
            new Claim("yyy", "222")
        });

        await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, claims);
    }

, но при попытке доступа через HttpContext в сервисе, как показано ниже

var claims = HttpContext.User.Identities.FirstOrDefault().Claims.ToList();

, возвращается 0 заявок.

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Я предположил, что заявки отсутствовали из-за порядка операторов, которые строят конвейер.

В Configure вы можете вставить промежуточное ПО в конвейер. При вставке промежуточного программного обеспечения важен порядок, в отличие от ConfigureServices, где его нет.

Поэтому, когда служба используется в промежуточном программном обеспечении, использующем утверждения до аутентификации пользователя, утверждения еще не доступны, Например:

app.UseMyMiddlewareThatCallsService(); 
app.UseAuthentication();

Но при изменении заказа претензии:

app.UseAuthentication();
app.UseMyMiddlewareThatCallsService(); 
0 голосов
/ 29 апреля 2020

Наконец, вот рабочий код.

        services.ConfigureApplicationCookie(options =>
        {
            options.Events.OnSignedIn = (context) =>
            {
                context.HttpContext.User = context.Principal;
                return Task.CompletedTask;
            };
        });
0 голосов
/ 27 апреля 2020

Это зависит от реализации схемы, обработчик аутентификации может не обновлять HttpContext.User по умолчанию.

Например, обработчик аутентификации cook ie не регистрирует текущего пользователя, вместо этого, он только генерирует билет аутентификации и устанавливает его в ответ .

SignInAsync создает зашифрованный повар ie и добавляет его к текущему ответу. Если AuthenticationScheme не указан, используется схема по умолчанию.

Если вы используете аутентификацию cook ie, вы можете обработать событие CookieAuthenticationEvents.OnSignedIn для обновления HttpContext.User :

.AddCookie(IdentityConstants.ApplicationScheme,
    opt =>
    {
        opt.Events = new CookieAuthenticationEvents
        {
            OnSignedIn = async ctx =>
            {
                ctx.HttpContext.User = ctx.Principal;
            }
        };
    });
...