User.IsInRole不起作用

Bar*_*osz 22 asp.net-mvc forms-authentication .aspxauth simplemembership

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

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

@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
Run Code Online (Sandbox Code Playgroud)

锁定它们不被普通用户渲染.登录系统后,此方法可以正常工作.当我在一段时间后返回并使用持久性cookie来验证我时,我确实登录了,但是

@User.IsInRole("Administrator")
Run Code Online (Sandbox Code Playgroud)

返回"False",因此我看不到管理员菜单项.同时

@User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

返回正确的登录名和

@User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)

返回"True",证明持久性cookie工作正常.为什么我不能访问用户角色,即使用户通过系统进行身份验证呢?

小智 19

使用MVC5角色的问题

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

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" />
</modules>
Run Code Online (Sandbox Code Playgroud)

我添加了删除name ="RoleManager"行,并且新的AspNet.Identity代码接管后允许我使用User.IsInRole(..)

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

  • 它也适用于我,但我担心删除RoleManager会产生什么后果.起初我的网站看起来还不错,但我不知道什么时候应该关注(我刚刚删除了哪些其他功能).任何人? (3认同)

Cem*_*tlu 17

我有一个微笑的问题.在我的情况下,当我注销并再次登录时问题解决了.


小智 6

你试过添加吗?

[InitializeSimpleMembership]
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*ull 5

我也有类似的问题,IsUserInRole返回假。通过将手表放在上面,我可以通过使用下面所述的过载来克服此问题。尝试一下,在出现错误的地方放置一个断点,然后看看会发生什么。

@if (Roles.IsUserInRole(Model.UserName, "Administrator"))
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*s R 5

旧问题,但是这里缺少一些信息。我遇到了同样的问题,需要牢记一件事。如果您在身份验证后测试用户身份(例如User.IsInRole(“ admin”))(而未将响应发送到客户端),则Identity框架尚未填充此会话信息(或者,至少我找不到方法)去做)。您要求的此信息会在控制器返回后的某个时候填充。如果要(IE)登录后重定向到不同的视图,取决于用户角色,则必须使用自定义授权过滤器。


小智 5

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

services.AddIdentity<IdentityUser,IdentityRole>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 AddDefaultIdentity Roles,则不会填充。

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)


Ser*_*gey 3

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

Roles.GetRolesForUser("sergey").Contains("Developer")
Run Code Online (Sandbox Code Playgroud)

因此,在使用 SimpleMembershipProvider 角色时还有其他有用的方法:

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");
Run Code Online (Sandbox Code Playgroud)