MVC5 Странное поведение User.IsInRole в макете и контроллере

У меня странная проблема, и я не могу ее понять. У меня есть форма входа в систему. Этот вид отображается внутри макета. В этом макете я использую User.IsInRole ("roleName"), чтобы настроить его в зависимости от роли текущего пользователя. Работает нормально.

В моем проекте (построенном на основе шаблона mvc) есть действие входа в систему с выражением "var result = await SignInManager.PasswordSignInAsync (...)". Я проверяю значение "result". Если он равен SignInStatus.Success, я использую User.IsInRole ("roleName"), чтобы определить роль пользователя и перенаправить его на какое-то другое действие. И вот проблема. User.IsInRole ("roleName") возвращает false. User.IsAuthenticated также является ложным. Это почему? Как справиться с этой ситуацией?

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

Спасибо за помощь.


person WaltLift0    schedule 19.11.2014    source источник
comment
Не могли бы вы опубликовать код ??   -  person ilans    schedule 19.11.2014
comment
Странно, что с некоторыми вещами вы никогда не сталкиваетесь, несмотря на то, как долго вы работали с определенным языком / фреймворком. Я не знаю наверняка, но возможно, что объект User в контроллере не обновится до следующего запроса, поэтому, даже если вы вошли в систему, User все еще не аутентифицирован. Я думаю, для этого было бы лучше, если бы вы нашли пользователя в базе данных и запросили роли в этом экземпляре.   -  person Chris Pratt    schedule 19.11.2014
comment
Это странно. Я хотел проверить, виновата ли я во всей этой ситуации. Я создал новый проект на основе mvc tamplate. Затем я попытался заставить текущего пользователя войти в систему. Проблема все еще существует. Вопрос в том, почему.   -  person WaltLift0    schedule 19.11.2014
comment
Еще одна вещь: если я успешно вхожу в систему и выхожу из действия входа, я могу использовать экземпляр пользователя в других действиях. Пользователь аутентифицируется в этих действиях.   -  person WaltLift0    schedule 19.11.2014


Ответы (1)


Внутренне в какой-то момент реальная работа 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.

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

Чтобы выполнить то, что вы хотите сделать, просто следуйте идее Криса Пратта и запросите в БД роли, а не идентификационные данные.

person James Sampica    schedule 21.11.2014