C# ASP.NET MVC授权-自定义?
我需要一个新的ASP.NET MVC应用程序。当用户登录到站点时,我们需要调用一个黑匣子,以查看是否允许用户使用控制器/操作 默认情况下,我们所有的控制器都有[Authorize]属性(登录除外),但只有在黑框显示用户可以的情况下,才能调用某些操作 当登录用户试图访问控制器操作时,如果黑匣子说他们无法访问,我如何让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
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不是静态的呢?这是紧密耦合,似乎有点问题。。。