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

Use Roles in ASP.NET MVC 5 Identity 2.0

我这辈子都不知道如何简单地向我的 MVC 5 应用程序添加角色。这在 MVC 4 中是如此轻而易举。

table 开箱即用, AspNetRoles,它有一个 ID 和名称("Admin"、"User",等等...) AspNetUsers,其中有一个Id和其他用户字段 AspNetUserRoles - 这个 table 有一个 UserId 和 RoleId,映射到上面的 tables。

我希望能够检查登录用户是否具有 "admin" 角色或仅具有 "user" 角色。

这是我尝试过的:

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

该值总是返回 false。

我也试过:

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

这会引发错误:

"Index was out of range. Must be non-negative and less than the size of the collection."

有没有简单的方法可以获取当前登录用户的角色?我看到过使用角色管理器的参考资料,但我一直无法让它发挥作用。我相信那是为了 Identity 1.0

谢谢

错误告诉您 userRole 是空的,因为即使索引为 0,也不是 "less than the size of the collection"。也就是说,相关用户不属于任何角色。

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

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

您可以为此使用 RoleManager,但我发现当您可以直接利用上下文时,这样做就有点矫枉过正了。

然后:

UserManager.AddToRole(userId, "Admin");

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

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

我遇到了类似的问题。使用 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>