我重写了authorize属性,我想知道是否可以通过RedirectResult将用户重定向到共享错误视图?
public override void OnAuthorization(AuthorizationContext filterContext)
{
// if failed
filterContext.Result = new RedirectResult("~/Shared/NotAuthorized.cshtml");
base.OnAuthorization(filterContext);
}
或者我是否必须创建错误控制器?如何编写字符串url以便在本地测试并发布到Web服务器时可以正常工作?
答案 0 :(得分:0)
你可以将它封装在它自己的属性中,就像这个
一样public class HandleUnauthorizedAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
if (filterContext.Exception.GetType() != typeof (SecurityException)) return;
var controllerName = (string) filterContext.RouteData.Values["controller"];
var actionName = (string) filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
ViewName = "Unauthorized",
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
因为如果授权失败,授权将抛出SecurityException。
然后在全局处理程序中注册它。无需控制器。
如果您不想使用单独的属性路由,则可以随时取出filterContext.Result代码并将其粘贴到OnAuthorize()方法中。