簡體   English   中英

我們如何在 ASP.NET 身份中實現權限?

[英]How do we implement permissions in ASP.NET identity?

我們了解如何使用 WebApi 在 ASP.NET 身份中實現身份驗證和授權。 例如,我們可以登錄一個用戶,然后檢索他的安全令牌和角色。

我們現在要添加權限。 例如,用戶steve可能是admin角色。 現在我們要為 admin 角色分配讀取、編輯和刪除權限。 我們如何在 ASP.NET Identity 中做到這一點? ASP.NET Identity 中是否存在現有的權限基礎結構?

我擴展了 ASP.NET Identity 以允許您描述的權限。 我這樣做是為了將安全模型與您的應用程序模型分離。 將角色放入 AuthorizeAttribute 的傳統方法的問題在於,您必須在設計應用程序的同時設計安全模型,如果進行任何更改,則必須重新編譯和重新部署應用程序。 使用我提出的方法,您可以在自定義 AuthorizeAttribute 中定義資源和操作,其中操作類似於權限。 現在你裝飾方法是這樣的:

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

然后,您可以將資源/操作分配給數據庫中的角色,在部署期間配置您的安全模型,並且無需重新部署即可對其進行修改。 在此處使用 SimpleMembership 撰寫了有關此方法的文章 后來在此處將其移植到 ASP.NET Identity 這些文章提供了帶有參考應用程序的完整源代碼的鏈接。

您應該擴展 Identity 類並將此功能添加到其中。 角色和權限之間存在多對多關系,因此您應該將 IdentityRole 類更改為如下所示:

public class IdentityRole<TKey, TRolePermission>
{
    public string Title { get; set; }

    public virtual ICollection<TRolePermission> Permissions { get; set; }
}

如您所見,您需要一個名為 RolePermission 的中間對象和表。 Permission 類看起來像這樣:

public class IdentityPermission<TKey, TRolePermission>
{
    public virtual TKey Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }

    public virtual ICollection<TRolePermission> Roles { get; set; }
}

然后您應該創建自定義 AuthorizeAttribute 以對控制器和操作執行身份驗證檢查。 那可能是這樣的:

public class AuthorizePermissionAttribute : AuthorizeAttribute
{
    public string Name { get; set; }
    public string Description { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext)
               && Task.Run(() => httpContext.AuthorizePermission(Name, Description, IsGlobal)).Result;
    }
}

您可以重寫 AuthorizeCore 方法,將權限認證添加到普通的基於角色的認證中。 盡管您可以輕松完成此操作,但我 在此處將其實現為 基於權限的開源 身份擴展,您可以直接使用它或從中獲得靈感自行完成。

我發現這個鏈接是 dotnet core 的一個很好的方法,可以應用於 dotnet 框架。 在這種方法中,我們需要的所有東西都與在 Identity 中實現的聲明相關,不需要擴展 Identity。

我們可以使用基於角色的授權,例如

[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)
{  

}

因為我一直在這里,我相信還有更多的人對這個問題感到困擾。

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持久GrantPermissions到您的數據庫中,它們將被添加到您的身份中。 您需要做的就是遵循在 startup.cs 中注冊對您的策略的聲明的正常程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM