我正在寻找重写一个非常密集的CRUD类型的ASP.NET页面来利用ajax调用(特别是jQuery ajax)。我这样做的顾虑是用户可能在此页面上的时间超过了表单身份验证超时。因此,我认为我应该使用每个ajax调用扩展表单身份验证票证(基本上它是如何在正常的Web表单提交模型中)。所以问题:
这甚至是一个有效的问题吗?如果是这样,是否可以编写一个jQuery插件来扩展表单身份验证超时?一个人已经存在吗?使用ASP.NET AJAX会是一种更好的方法吗?
任何评论\帮助将不胜感激。
答案 0 :(得分:8)
我可以确认通过jQuery 进行Web服务或页面方法调用将以与常规回发相同的方式扩展ASP.NET会话过期。
我经常使用五分钟的setInterval()来调用“保持活动”服务,这将保留用户的会话,即使他们让应用程序空闲。
答案 1 :(得分:1)
您应该能够在没有脚本管理器的情况下使用MS Ajax并使用jQuery来使用WebMethods。更多信息here
据我所知,调用WebMethod会延长用户的会话超时时间。所以这种方法可能是两全其美的。
答案 2 :(得分:1)
我将此用于我的keepalive webservice。 根据自己的喜好修改它,让我知道它是否有效...... 注意:session(“UID”)是我在登录时设置的变量。我给我的机票命名相同
<WebMethod(CacheDuration:=0, EnableSession:=True)> _
Public Function keepSessionAlive() As String
If Session("UID") Is Nothing OrElse Session("UID") = 0 Then
Throw New ApplicationException("Login")
End If
Session("lastKeepSessionAlive") = DateTime.Now
If Not (Context.Request.Cookies(System.Web.Security.FormsAuthentication.FormsCookieName) Is Nothing) Then
Dim ticket As System.Web.Security.FormsAuthenticationTicket
Try
ticket = System.Web.Security.FormsAuthentication.Decrypt(Context.Request.Cookies(System.Web.Security.FormsAuthentication.FormsCookieName).Value)
If ticket.Name = Context.Session("UID") Then
System.Web.Security.FormsAuthentication.SetAuthCookie(Context.Session("UID"), False)
Debug.WriteLine("keepAlive:AuthenticationReset")
End If
Catch ex As Exception
Debug.WriteLine("keepAlive:AuthenticationReset FAILED!!!")
Throw New ApplicationException("Login")
End Try
Else
Debug.WriteLine("keepAlive.Load: No Authentication Cookie. Error")
Throw New ApplicationException("Login")
End If
Return Session.SessionID.ToString
End Function
答案 3 :(得分:0)
使用Fiddler或其他一些实用程序来查看Microsoft是否足够聪明,以确保在AJAX调用之间更新cookie。如果你使用微软的内置asp.net AJAX(基本相似),你可能会有更好的运气(关于自动更新表格auth tickeet)。
答案 4 :(得分:0)
表单身份验证通过cookie工作。 Cookie随XMLHttpRequest请求一起发送,所以我认为这里没有问题。
请注意, 是与FormsAuthTicket过期相关的问题,并被强制重定向到login.aspx或其他类似问题。但这与你所说的完全不同。
答案 5 :(得分:-1)
我不认为我完全理解你在问什么,但就jquery ajax超时而言,你可以在ajax调用中设置本地超时。
示例:
$.ajax('ajax.php',{timeout: 60000},function (data) {
alert(data);
}