2009-10-31 15 views
3

我想寫一個ASP.NET MVC應用程序,其中用戶權限基於點而不是硬編碼角色本身。我試過研究授權和會員提供商,但是我發現所有信息都指向基於角色的身份驗證,而這並不是我模型的一部分。基於特定帳戶/角色以外的用戶權限時,如何定製用戶授權的最佳方式是什麼?

在寫這個問題時,我想知道我是否在研究正確的事情。這是一個自定義的角色提供者嗎?這樣的事情存在嗎?我突然想到,有一個自定義角色提供程序檢查用戶的要點以確定它們是否處於特定角色中可能是最簡單的方法,但我不知道關鍵字需要使用的關鍵字ASP.NET MVC找到正確的信息。

實現此目標的最佳方法是什麼?

回答

5

我會建議擴展AuthorizeAttribute的自定義授權屬性將是一個更好的路線。您的屬性將支持基於角色,用戶或點進行授權的能力,前兩者由基類提供,後者在自定義屬性中執行。

public class PointAuthorizeAttribute : AuthorizeAttribute 
{ 
    public int PointsRequired { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      var name = httpContext.User.Identity.Name; 
      using (var db = new SomeDataContext()) 
      { 
       var userPoints = db.Users 
            .Where(u => u.UserName == name) 
            .Select(u => u.Points) 
            .SingleOrDefault(); 
      } 
      return (userPoints >= PointsRequired); 
     } 
     return false; 
    } 
} 

用作

[PointAuthorize(PointsRequired = 50)] 
public ActionResult Comment(string comment) 
{ 
} 

您可能要進一步自定義它,這樣失敗的一個點要求重定向到一個錯誤信息,而不是到登錄頁面。在這種情況下,您也必須重寫OnAuthorization方法,也許可以在用戶的​​點級別太小的情況下確定,然後用錯誤視圖替換AuthorizationContext上的結果。

+1

+1這很出色,非常感謝。你不知道你剛剛爲我節省了多少工作。下次我在愛荷華州時,我會看着你,給你買一兩瓶啤酒。 – BobTheBuilder 2009-10-31 13:43:05

+0

我希望我能爲此投票多次。 – BobTheBuilder 2009-10-31 13:43:39

+0

你可以菊花鏈授權提供商以OR方式嗎?如果我有多個提供商,如果您是網站管理員,那麼您立即獲得了許可 - 因此不需要任何積分,或者是否應該直接編入自定義授權提供商? – BobTheBuilder 2009-10-31 13:48:40

相關問題