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

时间:2016-09-15 14:43:40

标签: c# asp.net-mvc authorization

我的MVC网页目前使用Session变量进行身份验证。我想尝试制作它,以便我可以使用自定义AuthorizeAttribute,这样我就能用[CustomAuth]装饰控制器。

目前RedirectToRouteResult正带我去#34;此页面无法显示"页。代码正在命中第一个RedirectToRouteResult。

如果我使用RedirectResult

,它也会这样做

如何将其指向我的登录页面?

这是我的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");

有没有办法使用匿名身份验证?

1 个答案:

答案 0 :(得分:0)

以下是我使用从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());
    }
}