ASP.NET Core 2.1 Как определить утверждения без атрибута авторизации? - PullRequest
0 голосов
/ 09 декабря 2018

Я создаю веб-приложение, которое использует проверку подлинности cookie, встроенную в ASP.NET Core 2.1.

У меня есть собственный метод входа, который запрашивает мою собственную проверку пароля и настройку утверждений.Примерно это выглядит так:

public async Task<ActionResult<LoginResponse>> DoLogin([FromBody] LoginRequest req)
{
    // fetch account and verify password

    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Sid, account.AccountId.ToString(), ClaimValueTypes.Integer),
        new Claim(ClaimTypes.Email, account.EmailAddress, ClaimValueTypes.Email),
        new Claim(ClaimTypes.Role, "member", ClaimValueTypes.String)
    };

    var identity = new ClaimsIdentity(claims, "password");
    var principal = new ClaimsPrincipal(identity);

    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

    return new LoginResponse
    {
        Success = true
    };
}

Я бы хотел условно отобразить кнопку «Выйти» в различных частях сайта, если у пользователя есть файл cookie, который аутентифицирует пользователя.Кроме того, я хотел бы получить утверждение Sid, чтобы я мог доставлять персонализированные сообщения в некоторых общедоступных частях сайта.

Проблема, с которой я столкнулся, заключается в том, что способ получения Sid работает только в том случае, если мой контроллер илиу действия контроллера есть атрибут [Authorize].Без атрибута [Authorize] утверждение отсутствует.

Код:

public static int? GetNullableAccountId(this ClaimsPrincipal principal)
{
    var claim = principal.FindFirst((Claim c) => { return c.Type == ClaimTypes.Sid; });

    if (claim == null)
        return null;

    return int.Parse(claim.Value);
}

// then in the controller I try to get the account id:
var accountId = accessor.HttpContext.User.GetNullableAccountId();
// always null even when I have a valid cookie

Клянусь, мне не понадобился атрибут [Authorize], чтобы он работал в предыдущих версияхASP.NET Core, но я не смог найти ничего значимого в журналах изменений.

Есть ли какая-то хитрость в получении ASP.NET Core для создания идентификатора пользователя для всех вызовов или я использую неправильный подход все вместе

1 Ответ

0 голосов
/ 09 декабря 2018

Кажется, это была глупая ошибка.Я вызывал app.UseAuthentication() после app.UseMvc() при настройке моего компоновщика приложений.

В документации явно указано следующее:

Вызовите метод UseAuthentication перед вызовом UseMvcWithDefaultRoute или UseMvc

Источник: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#configuration

...