Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC授权-自定义?_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Authorization - Fatal编程技术网

C# ASP.NET MVC授权-自定义?

C# ASP.NET MVC授权-自定义?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,authorization,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Authorization,我需要一个新的ASP.NET MVC应用程序。当用户登录到站点时,我们需要调用一个黑匣子,以查看是否允许用户使用控制器/操作 默认情况下,我们所有的控制器都有[Authorize]属性(登录除外),但只有在黑框显示用户可以的情况下,才能调用某些操作 当登录用户试图访问控制器操作时,如果黑匣子说他们无法访问,我如何让MVC子系统(我通过自定义[授权?]之类的方式猜测)以未经授权的响应进行响应 以下是我们称之为黑盒的方式: bool canAccess = BlackBox.HasAccess(c

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

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

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

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

 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\u 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)
 {

 }
}

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

如果BlackBox不是静态的呢?这是紧密耦合,似乎有点问题。。。