如何从自定义AuthorizeAttribute重定向到actionresult
本文关键字:重定向 actionresult AuthorizeAttribute 自定义 | 更新日期: 2023-09-27 18:07:05
我的MVC网页目前使用会话变量进行身份验证。我想尝试这样做,所以我可以使用自定义AuthorizeAttribute,这样我就可以用[CustomAuth]装饰控制器。
当前的RedirectToRouteResult带我到一个"这个页面不能显示"的页面。代码击中了第一个RedirectToRouteResult。
如果我使用redirecresult
,效果也是一样的我如何让它直接到我的登录页面?
这是我的customAuth
public class CustomAuth : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Session["isAuth"] != null)
{
if (!(bool)filterContext.RequestContext.HttpContext.Session["isAuth"])
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Base", action = "Login" }));
}
}
else
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Base", action = "Login" }));
}
}
}
编辑,
我想在控制器和动作中使用[customAuth]而不是在每个控制器的每个动作中使用
if (Session["isAuth"] != null)
{
if (!(bool)Session["isAuth"])
{
Session.Clear();
return RedirectToAction("Login", "Base");
}
}
else return RedirectToAction("Login", "Base");
是否有办法做到这一点与匿名身份验证?
我是这样做的,从HandleErrorAttribute派生的属性。
只需分配filterContent。Result到一个新的ViewResult来设置目标。如果你需要其他的属性,不要忘记。
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;
}
}
我把它注册到filterconfig。cs
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleUnauthorizedAttribute());
}
}