在MVC4中,我使用Roles.IsUserInRole检查给定用户是否处于某个角色。但是,对于MVC5,我不能再这样做了......
首先,它要求我在web.config上启用RoleManager,但后来我发现microsoft从Web.Security转移到了Microsoft.AspNet.Identity。
我现在的问题是,使用Microsoft.AspNet.Identity如何执行类似于Roles.IsUserInRole的操作? 和/或在角色和用户之间创建关系。
顺便说一下,我还在尝试了解新的身份验证方法(ClaimsIdentity?)。
答案 0 :(得分:10)
您应该阅读http://typecastexception.com/post/2014/04/20/ASPNET-MVC-and-Identity-20-Understanding-the-Basics.aspx了解Identity 2.0的基础知识!
还有一个完整的演示项目可以帮助您入门: https://github.com/TypecastException/AspNet-Identity-2-With-Integer-Keys
如果您将此作为您的身份基础的基础,您最终会得到以下内容:
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
const string name = "YourUsername"
const string roleName = "Admin";
var user = userManager.FindByName(name);
//check for user roles
var rolesForUser = userManager.GetRoles(user.Id);
//if user is not in role, add him to it
if (!rolesForUser.Contains(role.Name))
{
userManager.AddToRole(user.Id, role.Name);
}
答案 1 :(得分:6)
上面的帖子非常有用(感谢Serv,如果我的名声允许,我会投票)。它帮助我解决了我遇到的一些问题,只做了一些小改动,以适应我想要实现的目标。我特别的问题是我想检查MVC视图,如果当前用户在给定的角色组中。我还发现Roles.IsUserInRole不再有效了。
如果您在视图中执行此操作,但使用ASP.NET identity 2.0而不是之前的MVC版本提供的简单成员资格提供程序,则以下内容可能有助于作为一行解决方案:
bool isAdmin = HttpContext.Current.User.IsInRole("Admin");
然后,您可以将其与HTML结合使用,以选择性地显示菜单项(这是我一直在使用它的方式),如下所示:
@if (isAdmin)
{
<li>@Html.ActionLink("Users", "List", "Account")</li>
}
这使我可以阻止访问用户不是“管理员”角色成员的用户管理超链接。