User.IsInRole не работает

У меня есть приложение 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 работает нормально. Почему я не могу получить доступ к пользовательским ролям, даже если пользователь аутентифицирован системой?

Ответы

Ответ 1

У меня была знакомая проблема. В моем случае проблема решена после выхода из системы и входа в систему.

Ответ 2

Проблема с использованием ролей с 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

Ответ 3

Вы пробовали добавить

[InitializeSimpleMembership]

в контроллере, где вы делаете чек?

Ответ 4

У меня была аналогичная проблема с IsUserInRole возвратом false. Поместив на него часы, я смог преодолеть эту проблему, используя описанную ниже перегрузку. Попробуйте, поставьте точку останова, где вы становитесь ложным, и посмотрите, что произойдет.

@if (Roles.IsUserInRole(Model.UserName, "Administrator"))

Я уверен, вы также можете использовать User.Identity.Name в качестве первого параметра.

Ответ 5

Старый вопрос, но здесь есть некоторая информация. Я столкнулся с тем же вопросом, и есть одна вещь, о которой нужно помнить. Если вы проверяете идентификатор пользователя (например, User.IsInRole( "admin" ) сразу после аутентификации (без отправки ответа клиенту), система Identity еще не заполняет эту информацию сеанса (или, по крайней мере, я не мог найти способ сделать это). Эта информация, которую вы запрашиваете, заполняется в какой-то момент после возвращения вашего контроллера. Если вы хотите (I.E.) перенаправить на разные виды после входа в систему, в зависимости от роли пользователя, вам придется использовать настраиваемый фильтр авторизации.

Ответ 6

У меня была аналогичная проблема, похоже, что модуль аутентификации не полностью подключен к SimpleMembershipProvider. Чтобы обойти эту проблему, вы можете использовать класс Role для доступа к необходимой информации. Например, чтобы проверить, используете ли вы роль в роли, выполните следующие действия:

Roles.GetRolesForUser("sergey").Contains("Developer")

И поэтому другие полезные методы при работе с ролями SimpleMembershipProvider:

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");

Ответ 7

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

Попробуйте проверить, не закончился ли ваш сеанс, даже если вы все еще вошли в систему

Ответ 8

Довольно старая тема, но может подтвердить в vs 2015 решение для работы с веб-формами:

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" /> <!--add this to web config-->
</modules>

Ответ 9

Если вы используете 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") как ожидается.

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

Ответ 10

"EmailConfirmed" этого аккаунта, вероятно, все еще ложный, попробуйте изменить его на true

Database Screenshot

Ответ 12

Если вы используете последнюю версию Identity Framework, посмотрите, если вы используете следующие

services.AddIdentity<IdentityUser,IdentityRole>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();

Если вы используете AddDefaultIdentity, роли не заполняются.

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();

Ответ 13

Я уже некоторое время борется с менеджером роли 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);

Однако, если пользователь открывает ваше приложение в других окнах, это не будет обновлять их все.

Ответ 14

Вставьте этот код в 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);
            }
        }

Ответ 15

Добавить страницу перед пользователем. Это работает: Page.User.IsInRole("Administrator")

Ответ 16

Для моего кода это должно быть множественное число, а не единственное:

User.IsInRole("Administrators")