我有以下应用程序用户模型。我想实现一些方法来检查用户是否有角色以及用户是否有权限。一个用户可以有多个角色,一个角色可以有多个权限。
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<ApplicationRole> Roles { get; set; }
public bool HasRole(string _role)
{
return Roles.Any(r => r.Name == _role);
}
public bool HasPermission(string _permission)
{
return Roles.Any(r => r.Permissions
.Any(p => p.Name == _permission));
}
}
这是我的权限和角色类:
public class Permission
{
public byte Id { get; set; }
public string Name { get; set; }
public virtual List<ApplicationRole> Roles { get; set; }
}
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name) : base(name) { }
public virtual ICollection<Permission> Permissions { get; set; }
public bool IsPermissionInRole(string _permission)
{
return Permissions.Any(p => p.Name == _permission);
}
}
在Laravel中,我可以做一些简单的事情:
public function hasRole($role)
{
if (is_string($role)) {
return $this->roles->contains('name', $role);
}
return !! $role->intersect($this->roles)->count();
}
public function hasPermission(Permission $permission)
{
return $this->hasRole($permission->roles);
}
注我知道内置的User.IsInRole("Admin")
方法,但是你将如何实现hasPermission方法?
***UPDATE***在ApplicationUser类的下面一行中,我得到了intellisense消息:
public virtual List<ApplicationRole> Roles { get; set; }
ApplicationUser.Roles hides inherited member `IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserclaim>.Roles
To make the current memeber override that implementation add the overide keyword
不确定这意味着什么,但是这个导航属性是否允许我获取分配给用户的角色,或者只是获取表中所有角色的列表,在这种情况下,hasRole和has Permission方法将不起作用?
2条答案
按热度按时间jq6vz3qz1#
比如说:
更新:
您的 *Identity模型 * 不正确。正确的模型和更正的 HasPermission 方法为here。
2o7dmzc52#
我对上面给出的糟糕的答案感到非常失望。我不是说这些答案是错误的。但是你们把事情弄得太复杂了。我使用的是MVC 5和C#。* 所有 * 你要做的就是检查用户的claims对象,看看他们是否有特定的权限。这段代码检查Edit权限,看看它是否是活动的。
为了发现这一事实,我对@User.IsInRole执行了F12,看到有一个对HasClaim的调用需要类型和值,然后在上面的@if语句上放置了一个断点,并看到当用户具有此权限时,@User具有一个包含{Edit:True}。如果为False,则没有{Edit:False}对象,因此它无法通过测试。
另外:用户必须注销并重新登录才能更新此值。因此,如果您在用户处于浏览器会话时更改了用户的权限,则更改将在用户注销并重新登录后生效。这对于在30分钟不活动后自动结束其会话是一个很好的论据。