Asp.net mvc User.IsInRole不';行不通

Asp.net mvc User.IsInRole不';行不通,asp.net-mvc,forms-authentication,simplemembership,.aspxauth,Asp.net Mvc,Forms Authentication,Simplemembership,.aspxauth,我有ASP.NETMVC4应用程序。我使用简单的会员资格提供者,允许在登录表单下勾选“记住我”复选框。如果勾选,将创建Persistent cookie.ASPXAUTH,该文件将在登录日期后100天过期。除了应用程序的主菜单之外,一切都很好 菜单的某些部分仅对管理员用户可用。我使用: @if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") } 为普通用户锁定它们的渲染。这种方法在登录到系统后即可正常工作

我有ASP.NETMVC4应用程序。我使用简单的会员资格提供者,允许在登录表单下勾选“记住我”复选框。如果勾选,将创建Persistent cookie.ASPXAUTH,该文件将在登录日期后100天过期。除了应用程序的主菜单之外,一切都很好

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

@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
为普通用户锁定它们的渲染。这种方法在登录到系统后即可正常工作。当我在一段时间后返回并使用持久cookie对我进行身份验证时,我确实会登录,但是

@User.IsInRole("Administrator")
返回“False”,因此我看不到管理员菜单项。同时

@User.Identity.Name
返回正确的登录名和密码

@User.Identity.IsAuthenticated

返回“True”,证明持久cookie工作正常。为什么即使用户通过了系统的身份验证,我也不能访问用户角色?

我也遇到了类似的问题,似乎身份验证模块没有与SimpleMembershipProvider完全连接。为了解决这个问题,您可以使用角色类来访问所需的信息。例如,要检查“在中使用”角色是否可以使用以下内容:

Roles.GetRolesForUser("sergey").Contains("Developer")
在使用SimpleMembershipProvider角色时,还有其他有用的方法:

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

我在
IsUserInRole
返回false时遇到了类似的问题。通过在上面放置一块手表,我能够通过使用下面描述的过载来克服这个问题。试试看,把一个断点放在你出错的地方,看看会发生什么

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

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

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

即使您仍然登录,也尝试检查您的会话是否未过期

是否尝试添加

[InitializeSimpleMembership]

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

我遇到了一个小问题。在我的情况下,当我注销并再次登录时,问题就解决了

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

User.IsInRole("Administrators")

在MVC5中使用角色时出现问题

我找到了解决办法。在my web.config中:

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

我添加了remove name=“rolemanger”行,新的AspNet.Identity代码接管了它,允许我使用User.IsInRole(…)


非常古老的主题,但可以在vs 2015 Web表单应用程序工作解决方案中确认:

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

如果您正在使用Brock Allen的Identity Manager创建角色并将其分配给用户,那么您应该阅读本文:

您需要取消对以下行的注释:

this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
现在,您将认识到,以前担任角色的用户已不在角色中,您必须重新添加它们。如果查看AspNetUserClaims表,您将看到角色的claimType和您希望稍后使用的“”

执行此操作后,
User.IsInRole(“rolename”)
将按预期运行


我希望这能帮助别人,我花了一段时间才弄明白

在用户面前添加页面。这是有效的:
Page.User.IsInRole(“管理员”)

此帐户的“EmailConfirmed”可能仍然为false,请尝试将其更改为true


我已经与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);

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

旧问题,但此处缺少一些信息。我遇到了同样的问题,有一件事要记住。如果您在身份验证之后测试用户身份(如user.IsInRole(“admin”)(而不向客户端发送响应),identity framework尚未填充此会话信息(或者至少,我找不到这样做的方法)。您请求的此信息将在控制器返回后的某个时间点填充。如果您想(即)在登录后重定向到不同的视图,根据用户角色,您必须使用自定义授权筛选器。

这些答案对我都不起作用,但我在这里找到了答案:

密钥将以下内容添加到
Startup.Auth.cs

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}

如果您使用的是最新的身份框架,请查看您是否正在使用以下内容

services.AddIdentity<IdentityUser,IdentityRole>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
如果您使用的是AddDefaultIdentity角色,则不会填充

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
services.AddDefaultIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
将此代码粘贴到Global.asax中


可能会发生一些事情,下面是一些可以尝试的一般事情:

  • 试着在调试模式下运行,并确保代码行得到执行——这很愚蠢,但可能会发生
  • 如其他答案所述,尝试注销并重新登录
  • 确保角色的拼写正确
  • 确保为正确的用户分配了正确的角色id
  • 尝试将整个解决方案重新发布到服务器上-在我的例子中,所有内容在本地都可以正常工作,但在完全删除所有内容并重新发布之前,服务器上的一切都无法正常工作
  • 如果所有这些都失败了,试着运行一个开箱即用的项目,并在增加复杂性之前对其进行测试

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

    很遗憾,您的解决方案对我无效:警报(@User.IsInRole(“管理员”);艾尔
    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);
                }
            }