解决由AJAX请求时forms认证实效的重新认证问题

前言:

当用AJAX请求一个资源时,服务器检查到认证过期,会重新返回302,通过HTTP抓包,是看到请求了登录页面的,但是JS是不会进行跳转到登录页面。

使用环境:

ASP.NET MVC 4

JQUERY EASY UI

 

待解决的问题

1,如果AJAX请求时认证实效,那么跳转到登录页面重新认证,然后才能进行其它操作。(必须解决)

2,在认证成功之后最好不要返回首页,然后用户又得重新进行进入刚才页面。

 

解决方法

后端

添加一个自定义的AuthorizeAttribute

实现原理:如果是AJAX请求,并且没有进行授权,那么就返回 HTTP 401,代码如下:

Code

前端

如果想让所有页面都能捕获401错误,那么就需要在模版页_Layout.cshtml中用JS进行判,代码如下:

Code

 

虽然现在实现了认证。

那么如何在登录页面认证成功之后自动把该窗口给关闭了?

因为是用iframe嵌套的登录页面,所以这个属性很重要“parent”

实现方式:

1,在_Layout.cshtml中再加一个JS方法,用于登录成功后的回调函数,代码如下:

Code

 

2,在Controller中获取传过来的参数:
            ViewBag.AJAX_Login = Request.QueryString["AJAX_Login"];
在VIEW中

如果认证成功,就调用LoginSuccessCallBack方法关闭窗口,在重新获取刚才没有请求成功的数据。

Code

参考:

http://www.cnblogs.com/dudu/p/3384234.html

http://stackoverflow.com/questions/2472578/is-it-possible-to-use-redirecttoaction-inside-a-custom-authorizeattribute-clas/2472878#2472878

http://stackoverflow.com/questions/2580596/how-do-you-handle-ajax-requests-when-user-is-not-authenticated

http://stackoverflow.com/questions/7532261/ajax-and-formsauthentication-how-prevent-formsauthentication-overrides-http-401/7628655#7628655

posted @ 2013-10-25 16:38  吉桂昕  阅读(1197)  评论(2编辑  收藏  举报