我有一个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来阻止呈现视图?
答案 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。