Asp-MVC实体框架检查用户是否具有权限或角色

本文关键字:权限 角色 是否 实体 框架 检查 用户 Asp-MVC | 更新日期: 2023-09-27 17:59:42

我有以下应用程序用户模型。我想实现一些方法来检查用户是否有角色以及用户是否有权限。一个用户可以担任多个角色,一个角色可以拥有多个权限。

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);
}

我如何在ASPMVC中做类似的事情?注意:我知道内置的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方法将不起作用?

Asp-MVC实体框架检查用户是否具有权限或角色

之类的东西怎么样

public bool HasPermission(string _permission)
{
    return Roles.Any(r => r.IsPermissionInRole(_permission));
}

更新:

您的身份模型不正确。这里有正确的模型和正确的HasPermission方法。

我对上面给出的糟糕答案感到非常失望。我并不是说这些答案是错误的。但你们把事情搞得太复杂了。我将MVC 5与C#结合使用您所要做的就是检查用户的声明对象,看看他们是否有特定的权限。此代码检查"编辑"权限是否处于活动状态。

   @if (@User.HasClaim("Edit", "True")) 
    {
    <show your button or whatever here...>
    }

为了发现这一事实,我在@User.IsInRole上执行了F12,发现有一个对HasClaim的调用需要一个类型和值,然后在上面的@if语句上设置了一个断点,并看到当用户拥有此权限时,@User有一个包含{Edit:True}的Claims对象。当它为false时,就没有{Edit:false}对象,因此它无法通过测试。

此外:他们必须注销并重新登录才能更新此值。因此,如果您在用户处于浏览器会话时更改用户的权限,则在用户注销并重新登录之前,权限不会生效。这是在30分钟不活动后自动结束会话的一个很好的理由。