簡體   English   中英

ASP.NET MVC授權-自定義?

[英]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.

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