ajax注册验证 asp.net,asp.net – 当用户未通过身份验证时如何处理ajax请求?

编辑:

我以前写过上面的答案,现在我相信发送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@

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值