使用ASP.NET标识实现权限

时间:2014-12-22 12:19:28

标签: c# asp.net asp.net-mvc-5 asp.net-identity identity

我们目前正在使用ASP.NET Identity开发一个较小的ASP.NET MVC 5应用程序。它允许我们维护不同的项目和任务。我们最近实施了基本身份验证,因此我们可以向我们的网站注册用户并使用他们登录。

我们希望能够以项目为基础管理访问权限,因此我们可以为每个用户说明他对指定项目的读取,写入,管理或无权限。

我的第一个想法是我们可以在数据库中创建一个存储用户权限的简单新表。但我觉得可能有一种内置的方法来实现ASP.NET身份。

所以我的问题是,我们应该遵循哪条路径 - 手动构建一个新表来管理权限或使用ASP.NET身份提供的内置功能。<​​/ p>

1 个答案:

答案 0 :(得分:3)

  

使用ASP.NET Identity提供的内置内容

您可以使用的唯一内容是声明或角色,而且两者都不是为您想要的IMO而构建的。

因此,我会使用您自己的表格将项目链接到用户,例如:

public class UserProjectRights
{
    [Key]
    public ApplicationUser User { get; set; }
    [Key]
    public Project Project { get; set; }

    public AccessRight Right { get; set; }
}

然后,每当您执行某些需要特定权利的操作时,您需要检查该操作。有几种方法可以做到这一点。在我的应用程序中,我创建了“访问权限检查扩展”,如下所示(我为所有“访问权限实体”定义了一个通用接口,以“重用”该方法):

public static bool? CanView(this ApplicationUser user, Project project)
{
     var userRight = project.Rights.FirstOrDefault(r => r.User == user);
     return userRight == null ? (bool?)null : userRight.Right.HasFlag(AccessRight.View);
}

假设AccessRight是枚举:

[Flags]
public enum AccessRight
{
    View,
    Edit,
    Admin
}

然后你可以在你的逻辑中执行以下操作:

if (user.CanView(project) == true)
{
    // show project
}

我使用bool?所以我可以实现不同的“默认行为”,因为我知道如果返回null则没有正确定义。