使用ASP.NET标识实现权限

Tho*_*kas 7 c# asp.net identity asp.net-mvc-5 asp.net-identity

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

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

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

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

Chr*_*Fin 4

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

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

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

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

    public AccessRight Right { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

假设AccessRight是一个枚举,例如:

[Flags]
public enum AccessRight
{
    View,
    Edit,
    Admin
}
Run Code Online (Sandbox Code Playgroud)

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

if (user.CanView(project) == true)
{
    // show project
}
Run Code Online (Sandbox Code Playgroud)

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

  • @CodeCaster:我现在用一个简单的使用示例更新了我的答案。您认为这足以帮助人们进入这样的系统还是我应该详细说明? (2认同)