【问题标题】:ASP.NET MVC Authorization - Customize?ASP.NET MVC 授权 - 自定义?
【发布时间】:2013-12-14 00:59:59
【问题描述】:

我需要一个新的 ASP.NET MVC 应用程序。当用户登录网站时,我们需要调用一个黑框来查看是否允许用户使用控制器/操作。

我们所有的控制器默认都有 [Authorize] 属性(登录除外),但有些动作只有在黑框提示用户可以调用时才能调用。

当登录用户尝试访问黑匣子说他们可以访问的控制器操作时,我如何让 MVC 子系统(我猜测通过自定义 [Authorize?] 之类的东西)以未经授权的响应进行响应不。

这是我们调用 BlackBox 的方式:

 bool canAccess = BlackBox.HasAccess(controllerName, ActionName, userGuid);

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 authorization


    【解决方案1】:

    我建议使用自定义 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());
            }
    

    希望这会有所帮助!

    问候, 乌罗斯

    【讨论】:

    • 如果 BlackBox 不是静态的呢?这是紧耦合,似乎有点问题......
    【解决方案2】:

    您可以尝试从 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)
     {
    
     }
    }
    

    然后在您的控制器操作上使用您的自定义授权属性。

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2013-10-31
      • 2010-09-30
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多