Как настроить текущего пользователя в приложении ASP. NET MVC 5, используя ASP. NET Идентичность? - PullRequest
0 голосов
/ 22 января 2020

Мне трудно понять, как настроить текущего пользователя в приложении ASP. NET MVC 5, которое использует ASP. NET Идентичность.

Мы используем Интернет Сервис, который инкапсулирует аутентификацию. Функция вызывает эту службу и возвращает токен JWT, который можно «развернуть» для получения ClaimsIdentity. Насколько я понимаю, все, что вам нужно сделать в этот момент, это вызвать HttpContext.GetOwinContext().Authentication.SignIn() и передать ClaimsIdentity, чтобы установить sh текущего пользователя и заставить этого пользователя сохраняться при выполнении запросов.

Однако кажется, это не так. Если я запрашиваю this.User в контроллере или представлении впоследствии, это анонимный пользователь (this.User.Identity.IsAuthenticated оценивается в false). Кроме того, при обновлении страницы или перенаправлении становится очевидным, что текущего пользователя нет (опять же, this.User.Identity.IsAuthenticated оценивается как false).

Когда я проверяю личность, полученную из AccountHelper, все данные есть. Он полностью заполнен именем, идентификатором и полным набором требований.

Так, как правильно установить sh текущего пользователя и заставить его сохраняться при запросах?

// This call authenticates a user with the provided credentials against our user store
// and returns a bearer token and a ClaimsIdentity.
var response = new AccountHelper().AuthenticateUser(credentials);

if (response.IsAuthenticated) // This is true
{
    // This comes back with a fully populated identity, as expected.
    var claimsIdentity = response.ClaimsIdentity; 

    // This call has no effect, whatsoever. It doesn't set the current user.
    HttpContext.GetOwinContext()
               .Authentication
               .SignIn(new AuthenticationProperties { IsPersistent = true }, claimsIdentity);

1 Ответ

1 голос
/ 23 января 2020

Прежде всего, вы пропустили .Current в своем примере кода?

Это должно быть

HttpContext.Current.GetOwinContext()
    .Authentication
    .SignIn(...);

Во-вторых, я предполагаю, что вы настроили cook ie аутентификация в вашем приложении?

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
    ...
});

Здесь важно установить тип аутентификации! И когда вы генерируете удостоверение утверждений и перед тем, как передать его в метод .SignIn(), удостоверение утверждений должно иметь тот же тип проверки подлинности, чтобы они могли общаться!

Я бы использовал метод .CreateIdentityAsync() из UserManager класс для создания идентификатора вместо этого, поскольку вы можете передать тип аутентификации в качестве одного из параметров:

// Create an application user from your claim identity?
var appUser = new AppUser { ... };

// And pass the user into manager to create the identity with the same authentication
// type you used when you setup the cookie authentication
var claimsIdentity = _userManager.CreateIdentityAsync(appUser,
    CookieAuthenticationDefaults.AuthenticationType);

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

...