繁体   English   中英

Asp MVC Entity Framework 检查用户是否有权限或角色

[英]Asp MVC Entity Framework Check if User has Permission or Role

我有以下应用程序用户 model。 我想实现方法来检查用户是否具有角色以及用户是否具有权限。 一个用户可以有多个角色,一个角色可以有多个权限。

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

这是我的权限和角色 class:

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

如何在 ASP MVC 中做类似的事情? 注意我知道内置的User.IsInRole("Admin")方法,但是您将如何实现 hasPermission 方法?

* 更新 *在 ApplicationUser class 的以下行我收到智能感知消息:

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 方法将不起作用?

怎么样呢?

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

更新:

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

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

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

    }

为了发现这个事实,我在@User.IsInRole 上做了一个F12,看到有一个需要类型和值的HasClaim 调用,然后在上面的@if 语句上放一个断点,看看用户何时拥有此权限,@User 有一个包含 {Edit: True} 的声明 object。 当它为假时,没有 {Edit: False} object,所以它没有通过测试。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM