28

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

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

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

锁定它们,使其不被呈现给普通用户。这种方法在登录系统后就可以正常工作。当我在一段时间后返回并使用持久 cookie 对我进行身份验证时,我确实登录了,但是

@User.IsInRole("Administrator")

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

@User.Identity.Name

返回正确的登录名和

@User.Identity.IsAuthenticated

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

4

18 回答 18

25

我有一个微笑的问题。就我而言,当我注销并再次登录时,问题就解决了。

于 2014-10-30T14:05:35.330 回答
21

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

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

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

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

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

于 2015-07-09T18:54:31.350 回答
8

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

于 2016-05-24T11:06:59.377 回答
6

您是否尝试过添加

[InitializeSimpleMembership]

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

于 2013-12-26T09:17:53.917 回答
5

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

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

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

于 2013-03-26T23:26:46.720 回答
3

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

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

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

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");
于 2013-03-23T18:45:19.627 回答
3

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

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

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

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
于 2018-09-15T05:44:16.003 回答
2

这个账号的“EmailConfirmed”可能还是假的,试试改成真

数据库截图

于 2016-04-26T11:59:45.040 回答
2

如果您使用 Brock Allen 的 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")将按预期运行。

我希望这对某人有所帮助,我花了一段时间才弄清楚这一点。

于 2015-11-10T07:21:26.083 回答
2

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

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

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}
于 2017-09-08T19:39:29.123 回答
1

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

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

于 2013-03-26T23:37:14.743 回答
1

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

于 2021-01-02T10:09:58.030 回答
1

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

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" /> <!--add this to web config-->
</modules>
于 2015-10-30T12:11:37.053 回答
0

可能会发生几件事,这里有一些一般的事情可以尝试:

  1. 尝试在调试模式下运行并确保代码行被执行 - 愚蠢但可能会发生
  2. 如其他答案所述,尝试注销并重新登录
  3. 确保角色拼写正确
  4. 确保将正确的用户分配给正确的角色 ID
  5. 尝试将整个解决方案重新发布到服务器 - 在我的情况下,一切都在本地运行良好,但在服务器上没有,直到完全删除并重新发布
  6. 如果一切都失败了,在增加复杂性之前尝试运行一个开箱即用的项目并对其进行测试
于 2020-12-29T02:14:39.470 回答
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);

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

于 2016-04-28T00:34:12.880 回答
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);
            }
        }
于 2018-11-29T17:23:25.943 回答
-1

在用户前面添加页面。这有效: Page.User.IsInRole("Administrator")

于 2015-11-16T20:09:12.540 回答
-5

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

User.IsInRole("Administrators")
于 2015-02-13T18:17:00.247 回答