编辑:
我以前写过上面的答案,现在我相信发送403是不正确的方法。 403具有略微不同的含义,它不应该被使用。这是使用401的更正属性。它仅与Http401Result中的附加context.HttpContext.Response.End()和不同的HTTP代码不同:
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private class Http401Result : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
// Set the response code to 401.
context.HttpContext.Response.StatusCode = 401;
context.HttpContext.Response.Write(CTRes.AuthorizationLostPleaselogoutAndLogInAgainToContinue);
context.HttpContext.Response.End();
}
}
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
//OptionalAuthorize is turned on on base controller class,so it has to be turned off on some controller.
//That is why parameter is introduced.
public OptionalAuthorizeAttribute(bool authorize)
{
_authorize = authorize;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//When authorize parameter is set to false,not authorization should be performed.
if (!_authorize)
return true;
var result = base.AuthorizeCore(httpContext);
return result;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
//Ajax request doesn't return to login page,it just returns 401 error.
filterContext.Result = new Http401Result();
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
旧答案:
虽然我喜欢在其他答案(我以前有一个想法)发布的想法,我需要代码示例。他们来了:
public class OptionalAuthorizeAttribute : AuthorizeAttribute
{
private class Http403Result : ActionResult
{
public override void ExecuteResult(ControllerContext context)
{
// Set the response code to 403.
context.HttpContext.Response.StatusCode = 403;
context.HttpContext.Response.Write(CTRes.AuthorizationLostPleaselogoutAndLogInAgainToContinue);
}
}
private readonly bool _authorize;
public OptionalAuthorizeAttribute()
{
_authorize = true;
}
//OptionalAuthorize is turned on on base controller class,it just returns 403 error.
filterContext.Result = new Http403Result();
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
HandleUnauthorizedRequest被覆盖,所以在使用Ajax时返回Http403Result。 Http403Result将StatusCode更改为403,并向用户返回消息。在属性(授权参数)中有一些额外的逻辑,因为我打开了基本控制器中的[Authorize]并在某些页面中禁用它。
另一个重要的部分是在客户端对全局进行此响应。这是我在Site.Master中放置的:
$(document).ready(
function() {
$("body").ajaxError(
function(e,request) {
if (request.status == 403) {
alert(request.responseText);
window.location = '/logout';
}
}
);
}
);
我放置一个GLOBAL ajax错误处理程序,并且当$ .post失败并出现403错误时,响应消息将被提醒,并将用户重定向到注销页面。现在我不需要处理每个$ .post请求中的错误,因为它在全局处理。
为什么是403,而不是401? 401由MVC框架内部处理(这就是为什么重定向到登录页面是在授权失败后完成的)。
你怎么看待这件事?
@H_301_4@
@H_301_4@
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。