如何从自定义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");

是否有办法做到这一点与匿名身份验证?

如何从自定义AuthorizeAttribute重定向到actionresult

我是这样做的,从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());
    }
}