我有一个控件,我写的有一个javascript组件和一个Web服务组件。我遇到的问题是javascript设置为:
setInterval(this._checkAlertsHandler, this._messageCheckInterval * 1000);
这会调用一个像这样进行webservice调用的函数:
Alert.SiteAlertService.GetAlerts(this._receivedAlertsHandler, this._errorReceivedAlertsHandler);
因此,这是使用Web服务javascript代理方法来访问Web服务。问题是我们的应用程序具有表单身份验证和超时值,因此如果用户空闲时间过长,则会将其注销。
我的webservice调用显然会将包含会话和表单身份验证密钥的cookie发送到Web服务。然后,asp.net webservice会自动更新会话和表单身份验证。每当javascript访问Web服务时,它基本上保持用户活着。我不想要这种行为,这应该只是绕过它,所以即使这个js正在点击Web服务来检查新消息,如果用户没有在我们的应用程序上做回发(并且实际上是空闲的),它将仍然记录下来。这种情况没有发生:(
我想要发生的是这个对Web服务的间隔调用不会更新任何身份验证(我可以通过使用带有字典键/值的应用程序级别变量来解决用户会话ID的会话续订,所以我不会必须使用任何会话级变量)。
我该如何做/改变我的网络服务/或控制按照我想要的方式工作?
答案 0 :(得分:7)
我正在研究不同的方法。我正在做的一种方法是将其添加到Ajax服务端点:
// Hide the cookie so this call doesn't extend the user's ticket
HttpContext ctx = HttpContext.Current;
ctx.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
通过这种方式,您可以取消Auth Ticket续订,正确更新的Cookie将永远不会返回给客户。
如果您要排除多个Ajax端点,可以实现一个模块来识别这些端点,并包含从响应中删除cookie的代码。
答案 1 :(得分:1)
@RyanW提供了我需要的答案,所以这里是MVC的实现,使用一个属性来保持DRY。
using System.Web.Mvc;
using System.Web.Security;
namespace Your.Web.Attributes
{
public class RemoveAuthCookieAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
base.OnActionExecuted(filterContext);
}
}
}
实现:
[RemoveAuthCookie]
public ActionResult PollMe()
{
return View();
}
答案 2 :(得分:0)
您可以从表单身份验证中排除您的Web服务:
<location path="yourwebservice.asmx">
<system.web>
<authorization>
<allow users="?"/>
<authorization>
</system.web>
</location>
但您可能需要有关用户的信息,因此您可以将Web服务配置为使用表单身份验证,但停用SlidingExpiration
:
<location path="yourwebservice.asmx">
<system.web>
<authentication mode="Forms">
<forms slidingExpiration="false"></forms>
</authentication>
</system.web>
</location>
请务必测试表单Cookie过期后会发生什么。也许你还必须重新定义loginurl。
答案 3 :(得分:0)
您是否可以将您的web服务asmx文件放入其自己的单独的项目/解决方案/应用程序中?
这样它应该为您的主应用程序使用不同的会话ID。