我會建議擴展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這很出色,非常感謝。你不知道你剛剛爲我節省了多少工作。下次我在愛荷華州時,我會看着你,給你買一兩瓶啤酒。 – BobTheBuilder 2009-10-31 13:43:05
我希望我能爲此投票多次。 – BobTheBuilder 2009-10-31 13:43:39
你可以菊花鏈授權提供商以OR方式嗎?如果我有多個提供商,如果您是網站管理員,那麼您立即獲得了許可 - 因此不需要任何積分,或者是否應該直接編入自定義授權提供商? – BobTheBuilder 2009-10-31 13:48:40