Asp.net mvc User.IsInRole不';行不通
我有ASP.NETMVC4应用程序。我使用简单的会员资格提供者,允许在登录表单下勾选“记住我”复选框。如果勾选,将创建Persistent cookie.ASPXAUTH,该文件将在登录日期后100天过期。除了应用程序的主菜单之外,一切都很好 菜单的某些部分仅对管理员用户可用。我使用: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") } 为普通用户锁定它们的渲染。这种方法在登录到系统后即可正常工作
@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中
可能会发生一些事情,下面是一些可以尝试的一般事情:
清除所有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);
}
}