使用ASP.NET Identity实现权限

8
我们目前正在使用ASP.NET Identity开发一个较小的ASP.NET MVC 5应用程序,它允许我们管理不同项目及其任务。最近,我们实现了基本身份验证功能,因此我们能够注册用户并与他们登录。
我们希望能够基于项目管理访问权限,以便我们可以为每个单独的用户指定他对特定项目拥有读取、写入、管理员或无权限等权限。
我的第一反应是我们可以在数据库中创建一个简单的新表来存储用户权限。但我感觉ASP.NET Identity可能有内置的方法来实现这一点。
所以我的问题真正是,我们应该选择哪条路 - 手动构建新表来管理权限还是使用ASP.NET Identity提供的内置功能?

也许这篇文章能帮助你做出决定:http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/ - barca_d
在ASP.NET身份验证中,没有内置的用户权限概念,因为它们是非常应用程序特定的概念。有一个用户角色的概念,它只是用户的逻辑分组。通常,您会将一组特定的用户权限应用于角色。 - Ben Robinson
如果我理解正确的话,您建议为每个项目的每个访问限制(读/写/管理员)创建一个角色? - Thorakas
1个回答

4

使用 ASP.NET Identity 提供的内置功能

在这里,您唯一可以使用的是声明或角色,但我认为它们都不适合您想要的。

因此,我建议您使用自己的表格来将项目与用户链接,例如:

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,就没有定义正确的值。


然后,在每个处理某个项目或与项目相关实体有关的控制器中,您需要检查用户是否对给定(父)项目具有适当的权限。 - CodeCaster
1
@ChrFin,你只是创建了一个表格,还没有完全到位。虽然这不是你答案中必须的,但是原帖和未来的访问者可能会感到困惑。 - CodeCaster
@Rawling:也许你可以发布一个展示这种实现方式的答案?我也对这样的解决方案感兴趣,因为它在其他情况下可能对我也有用... - Christoph Fink
2
@CodeCaster:我现在更新了我的答案,并提供了一个简单的使用示例。你认为这已经足够帮助人们进入这样的系统了吗?还是我应该再详细解释一下? - Christoph Fink
@ChrFin 再次提醒,我无法记住我的确切实现方式,因此我仅仅是评论说这并非不可能,而不是提供我的答案。 - Rawling
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接