在javascript中调用ASMX webservice而不重置ASP.NET身份验证计时器 快速总结

在javascript中调用ASMX webservice而不重置ASP.NET身份验证计时器 快速总结,asp.net,ajax,xmlhttprequest,asmx,iis-7.5,Asp.net,Ajax,Xmlhttprequest,Asmx,Iis 7.5,从客户端ping回ajax中的web服务可以保持用户会话的活动状态,我不希望这种情况发生 更广泛的总结 对于我们正在开发的网站,我们需要客户端在服务器(IIS7.5)上ping回(js)一个webservice(ASMX)。这会让服务器知道用户仍然在站点上,并且没有浏览到其他站点 这是因为我们的客户希望让用户锁定记录,但如果他们浏览到其他站点,则让其他人接管这些锁定的记录。也许客户端在站点上但不活动和在另一个站点上的区别似乎不重要,但这有点无关,我不需要编写UI规范,我只需要让它工作 我的问题是

从客户端ping回ajax中的web服务可以保持用户会话的活动状态,我不希望这种情况发生

更广泛的总结 对于我们正在开发的网站,我们需要客户端在服务器(IIS7.5)上ping回(js)一个webservice(ASMX)。这会让服务器知道用户仍然在站点上,并且没有浏览到其他站点

这是因为我们的客户希望让用户锁定记录,但如果他们浏览到其他站点,则让其他人接管这些锁定的记录。也许客户端在站点上但不活动和在另一个站点上的区别似乎不重要,但这有点无关,我不需要编写UI规范,我只需要让它工作

我的问题是,ping通过标准表单身份验证超时机制阻止用户在服务器上超时。这并不奇怪,因为在后台有30秒的ping使会话保持活动状态。尽管我们想知道用户是否仍在站点上,但我们希望遵守正常的表单身份验证超时机制

我想我可以通过删除XMLHttpRequest(即服务器ping)中的ASP.NET_SessionId和.ASPXAUTH cookies来解决这个问题,但我不知道如何做到这一点

以下是我的web服务和方法的定义:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class PingWS : WebService
{
    [WebMethod]
    public void SessionActive(string sessionID)
    {
        // does stuff here
    }
这就是我在js中调用它的方式(请求是通过HTTPS进行的,:

$.ajax({
    type: "POST",
    url: "PingWS.asmx/SessionActive",
    data: 'sessionID=' + aspSessionID + '}',
    beforeSend: function (xhr) {
        xhr.setRequestHeader('Cookie', '');
        xhr.setRequestHeader('Cookie', 'ASP.NET_SessionId=aaa; .ASPXAUTH=bbb;');
    },
    dataType: "json"
});
我尝试使用setRequestHeader,但这只是附加到头上,而不是覆盖头,IIS很乐意忽略我添加的垃圾

我在想,也许我应该在服务器端尝试这样做,有人将PingWS.asmx从循环中移除,这样它就不会保持会话处于活动状态,但我不确定如何做到这一点

虽然问题的标题是集中在清除标题中的cookie,但如果有人指出我真的很愚蠢,并且实际上有更好的方法来尝试做我正在做的事情,我会非常高兴

我在想,在这个阶段,也许我需要在webmethod中添加一些东西,说明这个特定页面的非活动时间,并使用这些知识手动超时。这听起来很简单,所以我想我现在就这么做。我仍然相信,一定有一种简单的方法来完成我最初想做的事情

更新 我认为我在这里的cookie操作方面非常糟糕,因为.ASPXAUTH和ASP.NETSessionId cookie都是HttpOnly,这意味着浏览器会将它们从您手中拿走,您无法通过document.cookies对象访问它们。因此,我想说,这给我留下了:

  • 更新我的SessionAlive webmethod来跟踪每个请求,这样我就可以知道用户在一个页面上空闲了多长时间,如果需要的话,可以超时
  • 在服务器端以某种方式标记.asmx页面,使其脱离正常的身份验证/会话跟踪流

  • 我知道怎么做1.所以我从这里开始,但2.对我来说似乎更干净。

    当你发现你在客户端cookie操作(或任何类型的客户端操作)方面运气不佳时。操作标头可能是可行的,但您必须在管道中很早就截获流量。我甚至不知道在服务本身中是否可行,但像Zeus这样的流量管理器可以做到。我不相信以忽略给定端点和客户端组合的方式配置会话引擎是可行的请求,尽管应该可以替换整个会话引擎,但我认为这将是无文档的,而且非常耗时


    基本上,您需要在流量接触服务之前对其进行操作,否则您将无法解决此问题。会话不是设计为变体的。

    您可以将身份验证cookie限制为给定路径:

    <authentication mode="Forms">
      <forms path="/admin" />
    </authentication>
    
    
    
    这样,身份验证cookie将只发送到站点的
    /admin
    部分,如果将web服务放在根目录下,则可以使用AJAX ping它,而不发送cookie


    另一种选择是将此Web服务托管到一个单独的虚拟目录中。

    有一个服务器端答案。基本上,您可以在表单身份验证上禁用滑动超时,然后自己手动滑动超时,并跳过它进行ping

    对我来说很容易,因为每个页面都使用相同的根站点。母版和所有页面都从相同的基类继承

    总结如下:

    这是一个很好的主意,在这种情况下,我需要排除一条路径。我会检查一下。@Andrew,是的,我知道您需要排除,但不幸的是,
    path
    参数用于cookies的方式是通过包含。