У меня странная проблема, и я не могу ее понять. У меня есть форма входа в систему. Этот вид отображается внутри макета. В этом макете я использую User.IsInRole ("roleName"), чтобы настроить его в зависимости от роли текущего пользователя. Работает нормально.
В моем проекте (построенном на основе шаблона mvc) есть действие входа в систему с выражением "var result = await SignInManager.PasswordSignInAsync (...)". Я проверяю значение "result". Если он равен SignInStatus.Success, я использую User.IsInRole ("roleName"), чтобы определить роль пользователя и перенаправить его на какое-то другое действие. И вот проблема. User.IsInRole ("roleName") возвращает false. User.IsAuthenticated также является ложным. Это почему? Как справиться с этой ситуацией?
Я просто хочу перенаправить пользователя на определенное действие - каждый тип пользователя имеет свою первую страницу, поэтому мне нужно определить роль пользователя после того, как он войдет в систему.
Спасибо за помощь.
Ответ 1 · James Sampica
Внутренне в какой-то момент реальная работа SignInManager.PasswordSignInAsync(...) вызывает AuthenticationManager.SignIn. Глядя на спецификацию для этого, мы видим этот комментарий ...
// Summary:
// Add information to the response environment that will cause the appropriate
// authentication middleware to grant a claims-based identity to the recipient
// of the response. The exact mechanism of this may vary. Examples include
// setting a cookie, to adding a fragment on the redirect url, or producing
// an OAuth2 access code or token response.
Я считаю, что причина, по которой вы не можете запрашивать роли, проверять авторизацию или что-либо еще, связанное с утверждениями или идентификаторами, заключается в том, что запрос еще не имеет настройки этой информации до тех пор, пока ответ, содержащий идентификатор, не будет сначала отправлен обратно в клиент.
Чтобы выполнить то, что вы хотите сделать, просто следуйте идее Криса Пратта и запросите в БД роли, а не идентификационные данные.