在 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>
我这辈子都不知道如何简单地向我的 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>