[英]ASP.NET MVC Authorization - Customize?
我需要一個新的ASP.NET MVC應用程序。 當用戶登錄到站點時,我們需要調用一個黑框,以查看是否允許該用戶使用Controller / Action。
默認情況下,我們所有的控制器都具有[Authorize]屬性(“登錄”除外),但是某些操作只有在黑框表明用戶可以使用時才能調用。
當登錄的用戶嘗試訪問控制器動作(黑匣子說不能)時,我將如何使MVC子系統(通過自定義[Authorize?]之類的東西)響應未授權的響應。
這是我們稱為BlackBox的方式:
bool canAccess = BlackBox.HasAccess(controllerName, ActionName, userGuid);
我建議使用自定義的Authorize
屬性(您已經猜到了)。
下面是一個示例:
public class BlackBoxAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = base.AuthorizeCore(httpContext);
if (authorized)
{
var routeData = httpContext.Request.RequestContext.RouteData;
var controller = routeData.GetRequiredString("controller");
var action = routeData.GetRequiredString("action");
bool canAccess = BlackBox.HasAccess(controller, action, userGuid);
if (!canAccess)
{
httpContext.Items["BlackBoxError"] = true;
return false;
}
return true;
}
else
{
return authorized;
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
bool blackBoxError = filterContext.HttpContext.Items["BlackBoxError"] != null && Convert.ToBoolean(filterContext.HttpContext.Items["BlackBoxError"].ToString());
if (blackBoxError)
{
//change the controler name and action name accordingally as needed.
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
{
{ "controller", "Error" },
{ "action", "BlackBoxError" }
}
);
}
base.HandleUnauthorizedRequest(filterContext);
}
}
使用此功能后,您將必須用BlackBoxAuthorizeAttribute
替換所有AuthorizeAttribute
批注。 甚至更好:從控制器中刪除AuthorizeAttribute
並在app_start中注冊一個全局屬性。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new BlackBoxAuthorizeAttribute());
}
希望這可以幫助!
問候,Uros
您可以嘗試從AuthorizeAttribute繼承並創建您自己的屬性。
public class BlackboxAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//write here custom authorization logic
}
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
}
}
然后在您的控制器操作上使用您的自定義授權屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.