在我的应用程序中,这是我们迄今为止处理会话超时的方式
太好了,这是在 web.config 中定义表单身份验证的正确方法
那可能吗
不,抱歉,将 javascript 放在loginUrl
属性中是没有意义的。
或任何其他建议的方式来实现这一点
据我了解,如果会话已过期,您正在尝试使用一些 javascript 函数显示登录表单。
您应该区分对服务器的两种类型的请求:
- 标准同步请求(锚点、表单、重定向等)
- 异步请求(AJAX - 使用 javascript 完成)
在服务器端的这两种情况下,您都应该通过使用[Authorize]
属性装饰需要身份验证的操作来保护它们。例如:
[Authorize]
public ActionResult SomeAction()
{
...
}
一旦您保护了您的服务器,您就可以开始考虑如何处理表单身份验证 cookie 过期或只是匿名用户尝试调用此操作的情况。
对于对服务器的标准同步调用的第一种情况,表单身份验证模块将拦截请求,如果用户未通过身份验证或其会话过期,ASP.NET 将自动将您重定向到您在loginUrl
属性中定义的登录页面。它还将作为ReturnUrl
查询字符串参数传递给此操作,该操作将指向用户最初请求的 url,但他尚未获得授权。一旦他通过了身份验证,这个参数就可以用来将他重定向回这个页面。
现在第二种情况有点困难,因为由于 ASP.NET 自动将请求重定向到 LogOn 页面,您无法在 AJAX 成功回调中知道用户未被授权并且服务器将请求重定向到 LogOn 页面。Phil Haack 写了一篇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>