即使请求未经授权,也会呈现视图

时间:2017-04-27 21:04:09

标签: asp.net-mvc authorize-attribute

我有一个MVC应用程序,我有一个管理区域。当用户未登录时,我使用自定义AuthorizeAttribute将请求重定向到登录页面。

public class UserAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var user = AdminGlobals.CurrentUser;

        if (user == null || !user.IsActive)
        {
            return false;
        }

        return true;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var user = AdminGlobals.CurrentUser;
        var context = HttpContext.Current;

        //Do not redirect if the request is already redirecting
        if (context.Response.IsRequestBeingRedirected) return;

        if (user == null || !user.IsActive)
        {
            context.Response.Redirect("/login", true);
        }
        else
        {
            context.Response.Redirect("/unauthorized", true);
        }
    }
}

控制器和行动:

[UserAuthorize]
public ActionResult Index()
{
    return View();
}

我认为:

Hello @AdminGlobals.CurrentUser.Title

当应用程序处于调试模式时,我在视图内部和布局页面中都有NullReferenceExceptions,因为它尝试使用相同的变量@ AdminGlobals.CurrentUser,它是null。我知道我可以很容易地防止这种情况,但我无法理解为什么在未授权请求时呈现视图。是否可以在AuthorizeAttribute中使用RedirectToAction来阻止呈现视图?

1 个答案:

答案 0 :(得分:1)

我不确定在过滤器中使用Response是可行的方法。通常,您利用filterContext来执行重定向。例如:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    var user = AdminGlobals.CurrentUser;
    var context = filterContext.HttpContext;

    //Do not redirect if the request is already redirecting
    if (context.Response.IsRequestBeingRedirected) return;

    var routeData = new RouteValueDictionary(new {
        controller = "Home",
        action = "Unauthorized"
    });

    if (user == null || !user.IsActive)
    {
        routeData = new RouteValueDictionary(new { controller = "Home", action = "Login" });
    }

    filterContext.Result = new RedirectToRouteResult("Default", routeData);
}

我假设您的代码中的两个操作都在HomeController上;否则,将控制器名称更新为正确的值。

RedirectToRouteResult对象的构造函数中的“Default”,是您要应用的RouteConfig中路由的名称。

另外,使用filerContext中的HttpContext。