我们如何在ASP.NET身份中实现权限?

时间:2014-02-04 03:53:08

标签: c# asp.net asp.net-web-api permissions asp.net-identity

我们了解如何使用WebApi在ASP.NET身份中实现身份验证和授权。 例如,我们可以登录用户,然后检索他的安全令牌和角色。

我们现在想要添加权限。例如,用户 steve 可能属于 admin 角色。现在,我们要为管理员角色分配读取,编辑和删除权限。我们如何在ASP.NET身份中做到这一点? ASP.NET Identity中是否存在现有的权限基础结构?

4 个答案:

答案 0 :(得分:11)

我扩展了ASP.NET Identity,以便在描述时允许权限。我这样做是为了将安全模型与应用程序模型分离。将角色放入AuthorizeAttribute的传统方法的问题是您必须在设计应用程序的同时设计安全模型,如果进行任何更改,则必须重新编译和重新部署应用程序。通过我提出的方法,您可以在自定义AuthorizeAttribute中定义资源和操作,其中操作类似于权限。现在你装饰这样的方法:

[SimpleAuthorize(Resource = "UserProfile", Operation = "modify")]
public ActionResult ModifyUserProfile()
{
    ViewBag.Message = "Modify Your Profile";
    return View();
}

然后,您可以将资源/操作分配给数据库中的角色,在部署期间配置安全模型,并且可以在不重新部署的情况下对其进行修改。我wrote about this approach using SimpleMembership here。后来ported it to ASP.NET Identity here。这些文章链接到完整的源代码和参考应用程序。

答案 1 :(得分:0)

我们可以使用基于角色的授权,如

[Authorize(Roles = "Administrator")]
public class StoreManagerController : Controller
{
    // Controller code here
}

我们可以为权限创建枚举项目,如:

public enum PermissionItems
{ 
        [Group("Users")]
        [Description("Can edit Users")]
        EditUser,
        [Group("Users")]
        [Description("Can view Users")]
        ViewUser,
}

然后我们可以根据角色在数据库中添加这个枚举值。

并按属性

检入方法
RequirePermissions(PermissionItems.EditUser)
public ActionResult Edit(int id)
{  

}

答案 2 :(得分:0)

我发现this链接是适用于dotnet核心的好方法,可以应用于dotnet框架。 通过这种方法,我们需要的所有内容都与在Identity内实现的声明有关,因此无需扩展Identity。

答案 3 :(得分:0)

我来过这里,我相信还有更多人对这个问题感到困扰。

Identity Framework 是基本且完整的,您基本上可以构建一个复杂的应用程序,而无需扩展其底层模型。保持简单愚蠢:

角色就是角色,声明就是声明,但是 RoleClaim 表究竟存储了什么?那么它存储特定角色的声明。这些声明基本上可以是权限。保持简单。举个例子:

在这样的字典中具有预定义的权限:

public static class PredefinedClaims
{
    public static dynamic Get = new Dictionary<string,Claim>{
        {"PermissionToWrite", new Claim("PermissionToWrite","Write") },
        {"PermissionToRead", new Claim("PermissionToWrite","Read") },
    };
}

假设您有一个名为 UserId=1 的角色。您可以通过将该角色与声明相关联来创建权限。像这样:

var GrantPermissions= new List<RoleClaim>(){
  new RoleClaim{
    RoleId = 1,
    PredefinedClaims.Get()["PermissionToWrite"].ClaimType, // <= Set the Permission Type
    PredefinedClaims.Get()["PermissionToWrite"].ClaimType // <= Granted Edit rights.
  },
  // Add more roleclaims intances here
}

然后您可以将 GrantPermissions 持久化到您的数据库中,它们将被添加到您的身份中。您需要做的就是按照正常程序在 startup.cs 中注册您的政策声明。