在ASP.NET MVC 5 Identity 2.0中使用角色

时间:2016-06-22 18:57:34

标签: asp.net asp.net-mvc-5 asp.net-identity claims-based-identity asp.net-identity-2

对于我的生活,我无法弄清楚如何简单地将角色添加到我的MVC 5应用程序中。在MVC 4中这是一件轻而易举的事。

表格是开箱即用的, AspNetRoles,其中包含ID和姓名("管理员","用户"等等...) AspNetUsers,其中包含Id和其他用户字段 AspNetUserRoles - 此表有一个UserId和RoleId,映射到上面的表。

我希望能够检查登录用户是否拥有" admin"角色或只是"用户"作用。

以下是我的尝试:

if (User.IsInRole("Admin"))
{
 //do something
}

价值总是假的。

我也尝试过:

var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var userRole = UserManager.GetRoles(user.GetUserId());
if (userRole[0] == "Admin")
    {
     // do something
    }

抛出错误:

  

&#34;指数超出范围。必须是非负的且小于大小   集合。&#34;

是否有一种简单的方法可以为当前登录的用户获取角色?我见过使用Role Manager的参考资料,但我一直无法使用它。我相信那是为了身份1.0

由于

2 个答案:

答案 0 :(得分:3)

错误告诉您userRole为空,因为即使索引为0,也不会小于集合的大小&#34;。这意味着,有问题的用户不属于任何角色。

这种方法与以往没有太大的不同。首先,该角色必须存在,并且用户需要与该角色相关联。因此,第一步是填充您的角色:

db.Roles.Add(new Role { Name = "Admin" });

你可以使用RoleManager来解决这个问题,但是当你可以直接利用上下文时,我发现它是过度的。

然后:

UserManager.AddToRole(userId, "Admin");

根本就是它的全部内容。如果您愿意,可以覆盖Seed中的Migrations\Configuration.cs以自动将一些用户/角色植入数据库。对于角色,这看起来像:

context.Roles.AddOrUpdate(
    r => r.Name,
    new Role { Name = "Admin" },
    ...
);

答案 1 :(得分:0)

我有类似的问题。使用MySQL,我在配置文件中有这个:

<providers>
  <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

更改为:

<providers>
  <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>