Я создаю веб-приложение, которое использует проверку подлинности 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 для создания идентификатора пользователя для всех вызовов или я использую неправильный подход все вместе