如链接帖子中所述,我对内置的AuthorizeAttribute不满意,因为它总是重定向到声明的登录页面。我需要401-NotAuthenticated(我知道它被称为Unauthorized)和403-Forbidden之间的不同行为。禁止链接不应该链接到登录页面。
在建议的this或this解决方案中,我实现了一个名为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的一些内置(安全)功能?有人可以看到这个解决方案的任何问题吗?