在我的应用程序,这是我们如何处理会话超时至今
大,这是在web.config中定义窗体身份验证的正确方法
这是可能的
不,对不起,将javascript放在loginUrl
属性中是没有意义的。
或其他任何建议的方式来实现这一目标
从我了解你正在尝试使用一些JavaScript函数来显示登录表单,如果会话已过期。
你应该两种类型的请求区分到您的服务器:
- 标准同步请求(锚,形式,重定向,...)
- 异步请求(AJAX - 通过使用JavaScript实现)
在服务器端的这两种情况下,您都应该通过使用[Authorize]
属性修饰它们来保护需要身份验证的操作。例如:
[Authorize]
public ActionResult SomeAction()
{
...
}
一旦你已经获得你的服务器,你可以开始思考如何处理窗体身份验证cookie到期或匿名用户试图调用这个动作的简单情况。
对于标准同步调用服务器的第一种情况,表单身份验证模块将拦截请求,如果用户未通过身份验证或者会话过期,ASP.NET会自动将您重定向到您已定义的LogOn页面loginUrl
属性。它也将作为ReturnUrl
查询字符串参数传递给此操作,该操作将指向用户原先请求的url并且尚未授权他。这个参数可以用来在他认证之后将他重定向回这个页面。
现在第二种情况有点困难,因为ASP.NET自动将请求重定向到LogOn页面,您无法知道AJAX成功回调中用户未被授权,并且服务器将请求重定向到LogOn页面。菲尔哈克写了一个excellent article
关于如何防止这种重定向的AJAX请求。我邀请你现在阅读这篇文章。
好了,现在你已经阅读文章,并且已经安装了他的NuGet(Install-Package AspNetHaack
),你使用jQuery您的AJAX请求假设,你可以订阅.ajaxComplete()
全局事件处理程序。在这个处理程序中,您可以测试服务器响应代码,如果它是401,则表示该用户未被授权。所以,你可以采取相应的行动。
<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, ajaxOptions) {
if (xhr.status == 401) {
// the AJAX request failed because either the user was not
// authenticated or his session expired. So here you could
// do whatever you want. For example you could redirect him
// to the loginUrl defined in your web.config file:
window.location.href = '@FormsAuthentication.LoginUrl';
// you also have the possibility to show this logon form
// inside a popup or render it inline inside the page,
// by sending an AJAX request to this action and retrieving the
// corresponding partial
}
});
</script>
感谢@Darin,其实我不允许:(我想我的问题也可以,如果我能先手运行定时器sitewise的方式解决使用包它应该无论当前打开哪个页面,都可以在_layout.cshtml页面中持续运行。 –
如果您不允许使用该软件包,那么只需从软件包中获取代码并将其添加到你的项目,它是一个单一的文件。 –