User.IsInRole不起作用

时间:2013-03-22 09:55:33

标签: asp.net-mvc forms-authentication simplemembership .aspxauth

我有ASP.NET MVC 4应用程序。我使用Simple Membership Provider允许在登录表单下勾选记住我的复选框。如果勾选,则创建persitent cookie .ASPXAUTH,从登录日期起100天后到期。一切正常,除了应用程序的主菜单。

菜单的某些部分仅供管理员用户使用。我用:

@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }

将其锁定为常规用户呈现。登录系统后,此方法可以正常工作。当我在一段时间后返回并使用持久性cookie来验证我时,我确实登录了,但是

@User.IsInRole("Administrator")

返回"错误"所以我看不到管理员菜单项。同时

@User.Identity.Name

返回正确的登录名和

@User.Identity.IsAuthenticated

返回" True",证明持久性cookie工作正常的原因。为什么即使系统对用户进行了身份验证,我也无法访问用户角色?

17 个答案:

答案 0 :(得分:17)

我有类似的问题。在我的情况下,当我注销并再次登录时问题解决了。

答案 1 :(得分:17)

使用MVC5角色的问题

我找到了解决方案。在我的web.config中:

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" />
</modules>

我添加了删除名称=&#34; RoleManager&#34; line,以及新的AspNet.Identity代码接管允许我使用User.IsInRole(..)

http://forums.asp.net/t/1952572.aspx?Problem+using+roles+with+MVC5

答案 2 :(得分:6)

您是否尝试过添加

[InitializeSimpleMembership]

在您正在进行检查的控制器中?

答案 3 :(得分:5)

老问题,但这里有一些缺失的信息。我遇到了同样的问题,要记住一件事。如果您在进行身份验证(而不向客户端发送响应)后测试用户身份(,如User.IsInRole(“admin”)),则身份框架尚未填充了这个会话信息(或者至少,我找不到这样做的方法)。您要求的此信息将在您的控制器返回后的某个时间点填充。如果您希望(I.E.)在登录后重定向到不同的视图,则根据用户角色,您必须使用自定义授权过滤器。

答案 4 :(得分:4)

我遇到类似的问题IsUserInRole返回false。通过放置手表,我能够通过使用下面描述的过载来克服这个问题。尝试一下,给你一个断点,让你变得虚假,看看会发生什么。

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

我很确定您也可以使用User.Identity.Name作为第一个参数。

答案 5 :(得分:3)

我有一个类似的问题,似乎认证模块没有与SimpleMembershipProvider完全连接。要解决该问题,可以使用Role类来访问所需信息。例如,要检查角色的使用是否可以使用以下内容:

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

使用SimpleMembershipProvider角色时的其他有用方法:

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

答案 6 :(得分:1)

如果你正在使用Brock Allen的IdentityManager创建角色并将其分配给用户,那么你应该阅读这篇文章:https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3

您需要取消注释以下行:

this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;

现在您已经意识到您曾经担任角色的用户已不在其中,您必须重新添加它们。如果你看一下AspNetUserClaims表,你会看到自己的角色类型和http://schemas.microsoft.com/ws/2008/06/identity/claims/role&#39;你想要晚一点。

执行此操作后,User.IsInRole("rolename")的行为符合预期。

我希望这对某人有所帮助,花了我一段时间来解决这个问题。

答案 7 :(得分:1)

这些答案都不适合我,但我确实找到了答案:https://thinkthencode.wordpress.com/2016/04/24/azure-ad-using-app-roles-for-authorization/

关键是将以下内容添加到Startup.Auth.cs

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}

答案 8 :(得分:1)

&#34; EmailConfirmed&#34;这个帐户可能仍然是假的,尝试将其更改为true

Database Screenshot

答案 9 :(得分:1)

相当古老的话题但可以在vs 2015 Web表单应用程序工作解决方案中确认:

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

答案 10 :(得分:1)

我有一个类似的问题,但在我的情况下,问题是会话超时未与身份验证超时同步,所以我没有被自动踢出,但我的会话已过期,因为我的允许操作存储在会话变量,我无法为当前用户检索正确的选项。

即使您仍然登录

,请尝试检查您的会话是否未过期

答案 11 :(得分:0)

我一直在与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);

但是,如果用户在其他窗口中打开了您的应用程序,则不会更新所有应用程序。

答案 12 :(得分:0)

  

将此代码粘贴到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);
            }
        }

答案 13 :(得分:0)

可能会发生多种情况,以下是一些一般性的尝试:

  1. 尝试在调试模式下运行并确保代码行得到执行 - 愚蠢但可能会发生
  2. 如其他答案所述,请尝试注销并重新登录
  3. 确保角色拼写正确
  4. 确保为正确的用户分配了正确的角色 ID
  5. 尝试将整个解决方案重新发布到服务器 - 就我而言,在本地一切正常,但在完全删除并重新发布之前在服务器上无法正常运行
  6. 如果一切都失败了,请尝试运行一个开箱即用的项目并在增加复杂性之前对其进行测试

答案 14 :(得分:0)

清除所有 cookie 并尝试重新登录。如果我们改变了角色,cookie 可能不会意识到这一点。重置 Cookie 并使用您的新角色创建 Cookie,然后重试。

答案 15 :(得分:-1)

在用户面前添加页面。这有效:function mark(){ return promiseA .then(function(data){ .....}) .then(function(data){return new OBJECT}); } mark().then(function(data){ steve = data.SomeProperty; });

答案 16 :(得分:-5)

对于我的代码,它必须是复数,而不是单数:

User.IsInRole("Administrators")