ASP.NET MVC授权 - 自定义?

时间:2013-11-28 05:40:38

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

我需要一个新的ASP.NET MVC应用程序。当用户登录该站点时,我们需要调用一个黑盒子来查看是否允许用户使用Controller / Action。

默认情况下,我们所有的控制器都有[Authorize]属性(登录除外),但只有当用户可以使用黑框时才能调用某些操作。

如果登录用户尝试访问控制器操作,我将如何获得MVC子系统(我猜通过自定义[Authorize?]之类的东西)以响应未经授权的响应,黑盒子说他们可以“T

以下是我们称之为BlackBox的方式:

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

2 个答案:

答案 0 :(得分:2)

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

完成此操作后,您必须使用AuthorizeAttribute替换所有BlackBoxAuthorizeAttribute注释。甚至更好:从控制器中删除AuthorizeAttribute并在app_start中注册全局属性。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new BlackBoxAuthorizeAttribute());
        }

希望这有帮助!

此致 乌罗什

答案 1 :(得分:0)

您可以尝试继承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)
 {

 }
}

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