User.IsInRole不起作用(User.IsInRole doesn't work)

2019-07-22 15:07发布

我有ASP.NET MVC 4应用程序。 我用简单的成员资格提供允许打勾记得我在登录表单复选框。 若选择此项,persitent饼干.ASPXAUTH创建这将过期登录日期100天。 一切工作正常,除了应用程序的主菜单。

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

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

从被渲染为普通用户把它们锁。 这种方法只需登录到系统后,工作正常。 当我一会永久性Cookie后返回来验证我的,我得到登录,但

@User.IsInRole("Administrator")

返回“false”,所以我不能看到管理菜单项。 同时

@User.Identity.Name

返回正确的登录名和

@User.Identity.IsAuthenticated

返回“True”,什么证明,永久性的Cookie工作正常。 为什么我不能访问用户角色,即使用户被系统验证呢?

Answer 1:

我有一个smilar问题。 在我的情况下,问题解决了,当我注销并重新登录。



Answer 2:

使用带有MVC5角色问题

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

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

我添加删除名称=“RoleManager”路线,而新AspNet.Identity码接手允许我使用User.IsInRole(..)

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



Answer 3:

您是否尝试过加入

[InitializeSimpleMembership]

在控制器,你正在做的检查?



Answer 4:

老问题,但有一些在这里失踪的信息。 我遇到同样的问题,有一两件事要记住。 如果测试用户身份( 如User.IsInRole(“管理员”))只是身份验证后( 不发送响应客户端 ),标识框架没有填充此会话信息还没有 (或至少,我不能找到办法去做)。 你要申请这个信息,在你的控制器返回后的一些点被填充。 如果你想(IE)重定向到不同的意见登录后,根据不同的用户角色,你必须使用自定义过滤器的授权。



Answer 5:

我有一个类似的问题IsUserInRole返回false。 通过将一个表就可以了,我可以通过使用下面描述的过载克服的问题。 试试吧,把你得到虚假的,其中一个破发点,看看会发生什么。

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

我敢肯定,你也可以使用User.Identity.Name作为第一个参数。



Answer 6:

我有一个类似的问题,似乎验证模块不与SimpleMembershipProvider连接好完全。 要解决这个问题,你可以使用一个角色类访问所需的信息。 例如,要检查是否在角色使用,你可以使用以下命令:

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

和工作机智SimpleMembershipProvider角色时,那么其他有用的方法:

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


Answer 7:

我有一个类似的问题,但对我来说,问题是,会话超时未与认证超时同步,因此我并没有踢出自动但是我的会议被终止,而且由于我的允许的操作都存储在一个会话变量,我是不是能够检索当前用户的正确选项。

尝试检查,如果即使你仍然登录会话中的未过期



Answer 8:

很老话题,但可以确认在2015年VS Web表单应用程序工作的解决方案:

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


Answer 9:

此帐户的“EmailConfirmed”可能还是假的,尝试将其更改为真



Answer 10:

这些答案都不为我工作,但我没有找到答案在这里: https://thinkthencode.wordpress.com/2016/04/24/azure-ad-using-app-roles-for-authorization/

关键是加入以下Startup.Auth.cs

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}


Answer 11:

如果使用的是最新的身份框架请参阅如果您使用以下

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

如果您是使用AddDefaultIdentity角色没有得到填充。

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


Answer 12:

如果您使用IdentityManager由布鲁克·艾伦创建角色,并将它们分配给用户,那么你应该看看这篇文章: https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3

您需要取消注释以下行:

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

现在,你就会意识到,这曾经是在您的角色的用户在他们不再,你就必须重新添加。 如果你看看在AspNetUserClaims表,你会看到claimType角色和“ http://schemas.microsoft.com/ws/2008/06/identity/claims/role ”你想要的版本。

一旦你这样做, User.IsInRole("rolename")的行为与预期。

我希望这可以帮助别人,我花了一段时间来弄清楚这一点。



Answer 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);

但是,如果用户应用程序在其他窗口打开,这将不会更新所有的人。



Answer 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);
            }
        }


Answer 15:

添加页面在用户面前。 此作品: Page.User.IsInRole("Administrator")



Answer 16:

对于我的代码它必须是多元的,不是单数:

User.IsInRole("Administrators")


文章来源: User.IsInRole doesn't work