在CustomAuthorizeAttribute中抛出HttpException

时间:2014-12-19 08:14:06

标签: c# asp.net asp.net-mvc authorization

如链接帖子中所述,我对内置的AuthorizeAttribute不满意,因为它总是重定向到声明的登录页面。我需要401-NotAuthenticated(我知道它被称为Unauthorized)和403-Forbidden之间的不同行为。禁止链接不应该链接到登录页面。

在建议的thisthis解决方案中,我实现了一个名为AuthenticateAndAuthorizeAttribute的自定义属性,该属性继承自AuthorizeAttribute。

public class AuthenticateAndAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext) {
         if (filterContext.HttpContext.Request.IsAuthenticated) {
             filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
         }
         else {
             base.HandleUnauthorizedRequest(filterContext);
         }
    }
}

总而言之,它完成了应该做的事情。但是,因为只有响应的HttpStatusCode被更改,我得到一个空页面。我知道这是因为web.config中没有定义自定义错误页面。相反,我们使用solution和“覆盖”global.asax中的方法protected void Application_Error(object sender, EventArgs e)。这使我们能够为默认请求和ajax请求创建不同的错误页面。 不幸的是,仅在设置响应的状态代码时这不起作用。所以我使用throw HttpExceptions实现了该属性。

public class AuthenticateAndAuthorizeAttribute : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)  {
        if (filterContext.HttpContext.Request.IsAuthenticated) {
            throw new HttpException((int)System.Net.HttpStatusCode.Forbidden,  Forbidden!");
        } else {
            throw new HttpException((int)System.Net.HttpStatusCode.Unauthorized, "Not Authenticated!");
        }
    }
} 

现在我想知道,如果这是处理身份验证和授权的常用/正确方法,或者我是否打破了asp.net的一些内置(安全)功能?有人可以看到这个解决方案的任何问题吗?

0 个答案:

没有答案