Ответ 1
У меня была знакомая проблема. В моем случае проблема решена после выхода из системы и входа в систему.
У меня есть приложение ASP.NET MVC 4. Я использую Простой членский провайдер, который позволяет поставить галочку на флажке под регистрационной формой. Если отмечено галочкой, создается постоянный cookie.ASPXAUTH, срок действия которого истекает через 100 дней с даты входа. И все работает отлично, кроме главного меню приложения.
Некоторые части меню доступны только для пользователей admin. Я использую:
@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
чтобы заблокировать их от отображения для обычного пользователя. Этот подход отлично работает сразу после входа в систему. Когда я вернусь через некоторое время, и постоянный cookie используется для аутентификации меня, я зашел в систему, но
@User.IsInRole("Administrator")
возвращает "False", поэтому я не вижу элементов меню администратора. В то же время
@User.Identity.Name
возвращает правильное имя пользователя и
@User.Identity.IsAuthenticated
возвращает "True", что доказывает, что постоянный cookie работает нормально. Почему я не могу получить доступ к пользовательским ролям, даже если пользователь аутентифицирован системой?
У меня была знакомая проблема. В моем случае проблема решена после выхода из системы и входа в систему.
Проблема с использованием ролей с MVC5
Я нашел решение. В моем web.config:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" />
</modules>
Я добавил строку name= "RoleManager", и новый код AspNet.Identity занял место, позволяя мне использовать User.IsInRole(..)
http://forums.asp.net/t/1952572.aspx?Problem+using+roles+with+MVC5
Вы пробовали добавить
[InitializeSimpleMembership]
в контроллере, где вы делаете чек?
У меня была аналогичная проблема с IsUserInRole
возвратом false. Поместив на него часы, я смог преодолеть эту проблему, используя описанную ниже перегрузку. Попробуйте, поставьте точку останова, где вы становитесь ложным, и посмотрите, что произойдет.
@if (Roles.IsUserInRole(Model.UserName, "Administrator"))
Я уверен, вы также можете использовать User.Identity.Name
в качестве первого параметра.
Старый вопрос, но здесь есть некоторая информация. Я столкнулся с тем же вопросом, и есть одна вещь, о которой нужно помнить. Если вы проверяете идентификатор пользователя (например, User.IsInRole( "admin" ) сразу после аутентификации (без отправки ответа клиенту), система Identity еще не заполняет эту информацию сеанса (или, по крайней мере, я не мог найти способ сделать это). Эта информация, которую вы запрашиваете, заполняется в какой-то момент после возвращения вашего контроллера. Если вы хотите (I.E.) перенаправить на разные виды после входа в систему, в зависимости от роли пользователя, вам придется использовать настраиваемый фильтр авторизации.
У меня была аналогичная проблема, похоже, что модуль аутентификации не полностью подключен к SimpleMembershipProvider. Чтобы обойти эту проблему, вы можете использовать класс Role для доступа к необходимой информации. Например, чтобы проверить, используете ли вы роль в роли, выполните следующие действия:
Roles.GetRolesForUser("sergey").Contains("Developer")
И поэтому другие полезные методы при работе с ролями SimpleMembershipProvider:
Roles.RoleExists("Developer")
Roles.CreateRole("Developer");
Roles.AddUserToRole("sergey", "Developer");
У меня была аналогичная проблема, но в моем случае проблема заключалась в том, что таймаут сеанса не синхронизировался с таймаутом аутентификации, поэтому меня не выгнали автоматически, но моя сессия истекла, и поскольку мои разрешенные операции были сохранены в переменная сеанса, я не смог получить правильные параметры для текущего пользователя.
Попробуйте проверить, не закончился ли ваш сеанс, даже если вы все еще вошли в систему
Довольно старая тема, но может подтвердить в vs 2015 решение для работы с веб-формами:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" /> <!--add this to web config-->
</modules>
Если вы используете IdentityManager от Brock Allen для создания ролей и назначения их пользователям, вам следует прочитать эту статью: https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3
Вам нужно раскомментировать следующую строку:
this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
Теперь вы поймете, что вашего пользователя, который раньше был в ролях, больше нет в них, и вам придется заново их добавлять. Если вы посмотрите на таблицу AspNetUserClaims, вы увидите ClautiPlaype ofType и " http://schemas.microsoft.com/ws/2008/06/identity/claims/role ", которые вы хотите позже.
Как только вы это сделаете, User.IsInRole("rolename")
будет User.IsInRole("rolename")
как ожидается.
Я надеюсь, что это поможет кому-то, мне понадобилось время, чтобы понять это.
"EmailConfirmed" этого аккаунта, вероятно, все еще ложный, попробуйте изменить его на true
Ни один из этих ответов не работал у меня, но я нашел ответ здесь: https://thinkthencode.wordpress.com/2016/04/24/azure-ad-using-app-roles-for-authorization/
Ключ был добавлен к Startup.Auth.cs
:
TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = "roles"
}
Если вы используете последнюю версию Identity Framework, посмотрите, если вы используете следующие
services.AddIdentity<IdentityUser,IdentityRole>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
Если вы используете AddDefaultIdentity, роли не заполняются.
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
Я уже некоторое время борется с менеджером роли MVC5. Я подтвердил, что User.IsInRole
может возвращать разные результаты одновременно, и, по-видимому, это связано с тем, что объект User
кэшируется и должен быть недействительным. Один из способов сделать это - выйти из системы и снова войти в систему в качестве одного из указанных здесь ответов. Просто бросьте это в контроллер, который добавляет новую роль:
UserManager.AddToRole(User.Identity.GetUserId(), "Administrator");
var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
AuthenticationManager.SignOut();
AuthenticationManager.SignIn(newIdentity);
Однако, если пользователь открывает ваше приложение в других окнах, это не будет обновлять их все.
Вставьте этот код в Global.asax
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie =
Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket =
FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(new Char[] { ',' });
GenericPrincipal userPrincipal =
new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
Context.User = userPrincipal;
}
}
protected class RolesAttribute : AuthorizeAttribute
{
public RolesAttribute(params string[] roles)
{
Roles = String.Join(",", roles);
}
}
Добавить страницу перед пользователем. Это работает: Page.User.IsInRole("Administrator")
Для моего кода это должно быть множественное число, а не единственное:
User.IsInRole("Administrators")