![](/img/trans.png)
[英]How do I implement password reset with ASP.NET Identity for ASP.NET MVC 5.0?
[英]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") },
};
}
假設您有一個名為User
且Id=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.