如何在setInterval ajax Web服务调用中停止ASP.net表单身份验证/会话更新?

时间:2010-06-23 14:34:51

标签: asp.net javascript web-services forms-authentication session-timeout

我有一个控件,我写的有一个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的会话续订,所以我不会必须使用任何会话级变量)。

我该如何做/改变我的网络服务/或控制按照我想要的方式工作?

4 个答案:

答案 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。