代码之家  ›  专栏  ›  技术社区  ›  Kelly

C在客户机上通过HTTPS维护会话

  •  5
  • Kelly  · 技术社区  · 16 年前

    我需要登录到一个网站并执行一个操作。网站是基于REST的,因此我可以通过这样做轻松地登录(登录信息作为一个查询字符串包含在URL中,因此我不需要设置凭据):

    CookieContainer cookieJar = new CookieContainer();
    
    HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl);
    firstRequest.CookieContainer = cookieJar;
    firstRequest.KeepAlive = true;
    firstRequest.Method = "POST";
    HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse();
    

    那就行了,让我进去。我得到一个cookie来维护会话,它存储在上面显示的cookiejar中。然后我做第二个请求,比如:

    HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl);
    secondRequest.Method = "POST";
    secondRequest.KeepAlive = true;
    secondRequest.CookieContainer = cookieJar;
    WebResponse secondResponse = secondRequest.GetResponse();
    

    我保证将cookies分配给新的请求。但出于某种原因,这似乎不起作用。我返回一个错误,告诉我“我的会话已超时或过期”,这是一个接一个地完成的,所以这不是一个时间问题。

    我用fiddler检查了HTTP头,但我发现这很困难,因为这是HTTPS。(我知道我可以解密它,但似乎效果不好。)

    我可以把这个REST服务的网址粘贴到firefox中,一切正常,所以这肯定是我做错了什么,而不是连接的另一端。

    我不太熟悉https。我是否需要做其他事情来维持我的会话?我原以为是cookie,但也许在这两个请求中还有其他需要维护的东西?

    以下是我发送第一个请求时返回的头(除了我更改了cookie以保护无辜!):

    X-DB-Content-length=19
    Keep-Alive=timeout=15, max=50
    Connection=Keep-Alive
    Transfer-Encoding=chunked
    Content-Type=text/html; charset=WINDOWS-1252
    Date=Mon, 16 Nov 2009 15:26:34 GMT
    Set-Cookie:MyCookie stuff goes here
    Server=Oracle-Application-Server-10g
    

    任何帮助都会被感激的,我的想法都没有了。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Kelly    16 年前

    在解密了我程序中的HTTP流量之后,我终于让它工作了。

    我要返回的cookie没有列出路径变量。因此.NET采用当前路径并将其指定为cookie上的路径,包括当前页。如果是在 http://mysite/somepath/somepage.htm 它将设置cookie路径=/somepath/somepage.htm。这是一个bug,因为它应该分配给“/”,这是所有Web浏览器所做的。(希望他们能解决这个问题。)

    注意到这一点后,我抓起cookie修改了path属性,现在一切都正常了。

    任何其他有类似问题的人都可以去看看小提琴手。.NET使用Windows证书存储,因此要解密程序中的HTTP通信,您需要遵循以下说明: http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp . 您还需要在fiddler的选项\https选项卡下打开解密。

        2
  •  0
  •   Community Mohan Dere    9 年前

    MSDN :

    当用户在安全区域和公共区域之间来回移动时,ASP.NET生成的会话cookie(如果已启用无cookie会话状态,则为url)将以明文形式与它们一起移动,但不会通过未加密的HTTP连接传递身份验证cookie。 只要设置了安全cookie属性 .

    因此,基本上,如果“secure”属性设置为“false”,则可以通过HTTP和HTTPS传递cookie。

    也见 how can I share an asp.net session between http and https