MVC授权属性+ HttpUnauthorizedResult + FormsAuthentication

时间:2010-01-26 16:04:58

标签: asp.net-mvc forms-authentication

在CodePlex上浏览MVC部分后,我注意到MVC中的[Authorize]属性在授权失败时返回一个HttpUnauthorizedResult()codeplex AuthorizeAttribute class)。

来自CodePlex的HttpUnauthorizedResult()源代码(我不允许输入另一个URL,因为我的代表不够高,但用22929代替上面URL上的数字#266476):

// 401 is the HTTP status code for unauthorized access - setting this
// will cause the active authentication module to execute its default
// unauthorized handler
context.HttpContext.Response.StatusCode = 401;

特别是,评论描述了身份验证模块的默认未授权处理程序。

我似乎无法找到有关此默认未经授权的处理程序的任何信息。特别是,我没有使用FormsAuthentication,当授权失败时,我得到一个丑陋的IIS 401错误页面。

有没有人知道这个默认的未经授权的处理程序,特别是FormsAuthentication如何挂钩自己来覆盖它?

我正在为我的足球队写一个非常简单的应用程序,他确认或否认他们是否可以进行特定比赛。如果我在web.config中启用FormsAuthentication,重定向工作,但我没有使用FormsAuthentication,我想知道是否有解决方法。

1 个答案:

答案 0 :(得分:11)

如果您有Reflector,请查看System.Web.Security.FormsAuthenticationModule.Init()。此方法挂钩Application_EndRequest并调用OnLeave()。 OnLeave()方法检查响应代码是否为HTTP 401.如果是,则模块执行重定向,而不是将401冒泡到客户端。 (这个逻辑是评论所指的'默认未经授权的处理程序'。)在您的特定情况下,ASP.NET让401冒泡到客户端,但IIS正在拦截它并显示一个丑陋的错误页面。 / p>

您可以在Global.asax中执行非常类似的操作。创建一个方法Application_EndRequest;将在应用程序提供的每个请求结束时调用此方法。从这里,你可以做任何你想做的事。如果要检查响应是否为401并将其重定向到其他页面,则可以从此处执行此操作。