我有ASP.NET MVC 4应用程序。我使用Simple Membership Provider允许在登录表单下勾选记住我的复选框。如果勾选,则创建persitent cookie .ASPXAUTH,从登录日期起100天后到期。一切正常,除了应用程序的主菜单。
菜单的某些部分仅供管理员用户使用。我用:
@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
将其锁定为常规用户呈现。登录系统后,此方法可以正常工作。当我在一段时间后返回并使用持久性cookie来验证我时,我确实登录了,但是
@User.IsInRole("Administrator")
返回"错误"所以我看不到管理员菜单项。同时
@User.Identity.Name
返回正确的登录名和
@User.Identity.IsAuthenticated
返回" True",证明持久性cookie工作正常的原因。为什么即使系统对用户进行了身份验证,我也无法访问用户角色?
答案 0 :(得分:17)
我有类似的问题。在我的情况下,当我注销并再次登录时问题解决了。
答案 1 :(得分:17)
使用MVC5角色的问题
我找到了解决方案。在我的web.config中:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" />
</modules>
我添加了删除名称=&#34; RoleManager&#34; line,以及新的AspNet.Identity代码接管允许我使用User.IsInRole(..)
http://forums.asp.net/t/1952572.aspx?Problem+using+roles+with+MVC5
答案 2 :(得分:6)
您是否尝试过添加
[InitializeSimpleMembership]
在您正在进行检查的控制器中?
答案 3 :(得分:5)
老问题,但这里有一些缺失的信息。我遇到了同样的问题,要记住一件事。如果您在进行身份验证(而不向客户端发送响应)后测试用户身份(,如User.IsInRole(“admin”)),则身份框架尚未填充了这个会话信息(或者至少,我找不到这样做的方法)。您要求的此信息将在您的控制器返回后的某个时间点填充。如果您希望(I.E.)在登录后重定向到不同的视图,则根据用户角色,您必须使用自定义授权过滤器。
答案 4 :(得分:4)
我遇到类似的问题IsUserInRole
返回false。通过放置手表,我能够通过使用下面描述的过载来克服这个问题。尝试一下,给你一个断点,让你变得虚假,看看会发生什么。
@if (Roles.IsUserInRole(Model.UserName, "Administrator"))
我很确定您也可以使用User.Identity.Name
作为第一个参数。
答案 5 :(得分:3)
我有一个类似的问题,似乎认证模块没有与SimpleMembershipProvider完全连接。要解决该问题,可以使用Role类来访问所需信息。例如,要检查角色的使用是否可以使用以下内容:
Roles.GetRolesForUser("sergey").Contains("Developer")
使用SimpleMembershipProvider角色时的其他有用方法:
Roles.RoleExists("Developer")
Roles.CreateRole("Developer");
Roles.AddUserToRole("sergey", "Developer");
答案 6 :(得分:1)
如果你正在使用Brock Allen的IdentityManager创建角色并将其分配给用户,那么你应该阅读这篇文章:https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3
您需要取消注释以下行:
this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
现在您已经意识到您曾经担任角色的用户已不在其中,您必须重新添加它们。如果你看一下AspNetUserClaims表,你会看到自己的角色类型和http://schemas.microsoft.com/ws/2008/06/identity/claims/role&#39;你想要晚一点。
执行此操作后,User.IsInRole("rolename")
的行为符合预期。
我希望这对某人有所帮助,花了我一段时间来解决这个问题。
答案 7 :(得分:1)
这些答案都不适合我,但我确实找到了答案:https://thinkthencode.wordpress.com/2016/04/24/azure-ad-using-app-roles-for-authorization/
关键是将以下内容添加到Startup.Auth.cs
:
TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = "roles"
}
答案 8 :(得分:1)
&#34; EmailConfirmed&#34;这个帐户可能仍然是假的,尝试将其更改为true
答案 9 :(得分:1)
相当古老的话题但可以在vs 2015 Web表单应用程序工作解决方案中确认:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" /> <!--add this to web config-->
</modules>
答案 10 :(得分:1)
我有一个类似的问题,但在我的情况下,问题是会话超时未与身份验证超时同步,所以我没有被自动踢出,但我的会话已过期,因为我的允许操作存储在会话变量,我无法为当前用户检索正确的选项。
即使您仍然登录
,请尝试检查您的会话是否未过期答案 11 :(得分: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);
但是,如果用户在其他窗口中打开了您的应用程序,则不会更新所有应用程序。
答案 12 :(得分: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);
}
}
答案 13 :(得分:0)
可能会发生多种情况,以下是一些一般性的尝试:
答案 14 :(得分:0)
清除所有 cookie 并尝试重新登录。如果我们改变了角色,cookie 可能不会意识到这一点。重置 Cookie 并使用您的新角色创建 Cookie,然后重试。
答案 15 :(得分:-1)
在用户面前添加页面。这有效:function mark(){
return promiseA
.then(function(data){ .....})
.then(function(data){return new OBJECT});
}
mark().then(function(data){
steve = data.SomeProperty;
});
答案 16 :(得分:-5)
对于我的代码,它必须是复数,而不是单数:
User.IsInRole("Administrators")