在我的应用程序中,这就是我们到目前为止处理会话超时的方式
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="20" />
</authentication>
现在我想在客户端处理会话时间,就像这样
<authentication mode="Forms">
<forms loginUrl="showPopup();" timeout="20" />
</authentication>
这可能,或任何其他建议的方法来实现这一目标吗?
修改
我访问了同类型的其他问题,但无法从他们那里得到任何真正的帮助。
答案 0 :(得分:2)
在我的应用程序中,这就是我们到目前为止处理会话超时的方式
很好,这是在web.config中定义表单身份验证的正确方法
可能吗
不,抱歉,将javascript放入loginUrl
属性是毫无意义的。
或任何其他建议的实现方式
根据我的理解,如果会话已过期,您将尝试使用某些javascript函数显示LogOn表单。
您应该区分两种类型的服务器请求:
在服务器端的这两种情况下,您应该通过使用[Authorize]
属性进行装饰来保护需要身份验证的操作。例如:
[Authorize]
public ActionResult SomeAction()
{
...
}
一旦您保护了服务器,就可以开始考虑如何处理表单身份验证cookie过期,或者仅仅是匿名用户尝试调用此操作的情况。
对于第一个对服务器进行标准同步调用的情况,表单身份验证模块将拦截请求,如果用户未经过身份验证或其会话已过期,ASP.NET将自动将您重定向到您在服务器中定义的LogOn页面。 loginUrl
属性。它还将作为ReturnUrl
查询字符串参数传递给此操作,该操作将指向用户最初请求的URL并且尚未对其进行授权。然后,此参数可用于在经过身份验证后将其重定向回此页面。
现在第二种情况有点困难,因为ASP.NET自动将请求重定向到LogOn页面,你无法知道你的AJAX成功回调,用户未被授权,服务器将请求重定向到登录页面。 Phil Haack写了一篇关于如何阻止AJAX请求重定向的excellent article
。我邀请你现在阅读这篇文章。
好了,既然你已经阅读了这篇文章并安装了他的NuGet(Install-Package AspNetHaack
),假设你正在为你的AJAX请求使用jQuery,你可以订阅.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>
答案 1 :(得分:0)
此配置区域用于配置服务器端行为,该行为在服务器尝试处理会话已过期的请求时发生。这是客户的结果 - &gt;服务器请求页面。由于客户端是Web浏览器,并且设计与服务器断开连接,因此您必须在每个页面中包含所需的逻辑(可能在主布局模板中),然后以重复的间隔向服务器进行AJAX调用以确定用户的会话超时状态。弹出窗口也将在客户端处理。
这个配置区域可能无法帮助您实现目标,我只需完全删除<forms>
元素,然后使用对服务器的AJAX调用来解决问题。