1

在我在.NET MVC 4中的第一步,我創建了一個網站,我想實現用戶認證/授權。.net MVC 4授權(成員資格)

在我的實現中,我希望能夠將控件鏈接到角色。舉例來說,如果我有2個角色在我的系統:管理員和用戶的一些觀點說,我有3個輸入:

  <input class="search-field rounded" id="field1" type="text"/> 
      <input type="submit" name="submit"/> 

      <input class="search-field rounded" id="field2" type="text"/> 
      <input type="submit" name="submit"/> 

      <input class="search-field rounded" id="field3" type="text"/> 
      <input type="submit" name="submit"/> 

我想,一個管理員就可以查看和編輯在所有3個領域這個視圖,但用戶應該只看到其中的2個,並且能夠編輯其中的一個(這只是一個例子)。

所以基本上,我希望能夠爲控件定義權限,並且角色應該由權限集合組成(如果您可以想到更好的方法,我很樂意聽到它)。

所以這些都是我的約束,我看到有很多包裹(如Fluent SecuritySecurity Guard)涉及到這個問題,但我不太確定哪個是最好解決我的挑戰,如果有的話。

克服這種需求是否有最佳實踐?

任何幫助,高度讚賞。

回答

0

我最終創建了自己的自定義成員資格提供者和角色提供者。

在我的角色提供我添加了一個方法

public bool UserHasPermission(string username, string permission) {...} 

在我看來,我做:

@{ 
    var roleProvider = Roles.Provider as MyCustomRoleProvider; 
    bool addressEditPermission = roleProvider.UserHasPermission(User.Identity.Name, "addressEditPermission"); 
} 

然後我可以操控我的控制:

@Html.TextBoxFor(model => model.Name, new { @readonly = addressEditPermission }) 

你只需確保您的控件具有帶HTML屬性的重載。

我希望這可以幫助別人..

1

我已經這樣做了:

//In Controller 
ViewBag.Roles = Roles.GetRolesForUser(User.Identity.Name);//viewbag because I'm assuming this isn't what you want to strongly type to your page. 

//In View 
@{ 
    var roles = (Roles)ViewBag.Roles; 
} 
if(roles.contains("admin')) //put whatever you want in place of "admin" 
{ 
    //do something 
} 

在你的控制器,你可以給訪問某些觀點或局部視圖這樣 //在控制器如果你想要它。
[Authorize(Roles =「Admin,ImportExport,Search」)] //這只是爲了安全 public ActionResult whatever(){} *我使用剃鬚刀。如果不是,則用@ <%%替換@。

+0

謝謝你的回覆,但我不知道我得到你。您能否詳細說明使用您發佈的代碼的流程? – forhas 2013-02-16 23:55:14

2

idlehands23顯示了你如何訪問和檢查角色,但我猜你想在視圖級別使用這個功能。

在一個操作方法中,我通常將HttpContext.User傳入ViewBag,或者在強類型視圖的情況下,您可以將該主體傳遞給您的模型,並根據需要解析這些值。然後像這樣將模型傳遞給視圖。

return View(new ModelClass(HttpContext.User)) 

從這裏你可以添加額外的代碼到視圖的邏輯來解析/檢查的作用和使用例如具有更高特異性呈現HTML:

If (Model.User.IsInRole("Admin")) 
{ 
    //Render admin controls 
    //... 
} 
else 
{ 
    //Render User Controls 
    //... 
} 

使用你的操作方法的[Authorize(Role="Admin||User")]屬性將限制對整個用戶組的訪問。在這種情況下,您需要兩個操作方法和一個或兩個不同的視圖來呈現內容。但是,如果你只是想限制它,你可以做像這樣的任何授權用戶:

[Authorize] 
    public ActionResult Index(){} 

然後你可以在與他們被授權確定性視圖級別實現邏輯。

+0

因此,你建議我將當前角色傳遞迴視圖,然後視圖可以決定如何相應地呈現頁面。聽起來很有趣,我可能會試一試,並告訴你它是否適合我。 – forhas 2013-02-16 23:58:17