簡體   English   中英

asp.net基於MVC角色訪問控制器

[英]asp.net MVC role based access to controller

許多關於基於角色的訪問的在線文章都談到應用這樣的東西來確保基於角色的訪問控制器或動作

[Authorize(Roles = "Admin, Manager")]
public class SomeController : Controller
{ 

}

所有這一切都很好,但現在如果我需要實現我自己的基於角色的訪問權限,其中我在[RoleMaster]表中有角色,並且從另一個名為[UserRoles]的表中的[User]表中分配給用戶的角色。 在我的代碼中,我將在會話中有一個用戶對象,其中將包含一個角色列表

public class RegisteredUsers
{

    //... other user properties

    public List<UserRole> Roles { get; set; }

}

public class UserRole
{

    public string RoleID { get; set; }
    public string RoleName { get; set; }
    //... other properties

}

現在,我如何檢查RegisteredUsers對象的Roles列表中的UserRole.RoleName屬性,以匹配我使用以下命令分配給Authorize屬性的任何值:[Authorize(Roles =“Admin,Manager”)]。 在某些情況下,如果角色有管理員或經理,他們應該獲得訪問權限。 在某些情況下,我希望他們同時擁有Admin和Manager Role來獲取訪問權限。

此外,將來如果將新角色添加到系統中,我是否需要重新構建並重新部署我的應用程序並重新授予所有授權屬性?

我沒有找到任何明確的例子來實現相同的,或者我可能沒有正確搜索。 請以任何方式幫助我。 謝謝你的時間...

您需要實現自定義IPrincipal (或自定義RoleProvider ,但在我看來,IPrincipal更容易)。

在表單身份驗證控制器中,對您的用戶表進行身份驗證,並使用角色表中的角色創建IPrincipal。 您可能還希望在使用角色時設置Forms Auth cookie,這樣您就不需要在每個請求中使用數據庫(或使用會話)。 有關此方法的示例,請查看此問題中的代碼。

如果您的用戶沒有任何自定義屬性,則可以使用內置的GenericIdentity和GenericPrincipal。

編輯 - 如果您在會話中存儲用戶信息,則只需確保在每個請求開始時將HttpContext.Current.User設置為會話派生的IPrincipal(OnPostAuthenticate)

您需要使用此方法重建/重新部署以迎合新角色。 如果要在運行時動態分配角色並處理它們,則需要實現自定義AuthorizationAttribute - 這可以采用(例如)字符串'Operation'參數,該參數可以與DB中的角色匹配。 我會親自離開這個,直到你明白你需要它為止。

聽起來你可能會超過基於角色的安全設計。 如果您需要動態粒度或/或特權,那么您應該開始至少考慮更基於聲明的方法

您可以通過實現自定義IPrincipal來實現您所描述的一些內容,例如上面的鏈接顯示(沒有基於聲明的完整版)。

希望這可以幫助。

暫無
暫無

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

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