【问题标题】:Cross-origin XMLHttpRequest does not process ASP.NET_SessionId cookies - what could be the case?跨域 XMLHttpRequest 不处理 ASP.NET_SessionId cookie - 可能是什么情况?
【发布时间】:2011-11-28 07:56:02
【问题描述】:

我已经在标题问题上苦苦挣扎了几天,但没有成功。我有一个需要基本身份验证的 ASP.NET MVC 3 REST 服务器。我想使用 XMLHHttpRequest 编写以 AJAX 方式访问此服务器的 JS API。

为了响应包括 AJAX 在内的任何 http 请求,服务器添加 "Set-Cookie: ASP.NET_SessionId=<session id here>; path=/; HttpOnly" 标头 - 没关系。但似乎 Set-Cookie 标头没有被浏览器以任何方式处理 - 所以即使我使用相同的 XMLHttpRequest 对象进行下一个请求,cookie 设置不正确并且我无法维护会话。我可能做错了什么?

我的脚本已经在 Firefox 6 和 Safari 5 中测试过了,我在两个浏览器中都遇到了同样的问题。

【问题讨论】:

    标签: asp.net ajax session cross-domain


    【解决方案1】:

    您的主题提到您正在使用 CORS。如果是这样,请尝试将以下标头添加到您的响应中:

    Access-Control-Allow-Credentials: true
    

    【讨论】:

    • 已经试过了;此标头仅允许 XMLHttpRequest 发送凭据:如果此标头不存在于服务器对飞行前请求的响应中,则不会发生实际请求。所以我正在使用它,请求成功到达服务器,并使用适当的 cookie 生成响应。我的问题是浏览器没有处理那些正确的 cookie。
    • 您如何验证浏览器未处理 cookie?请注意,JavaScript 无法访问通过 CORS 设置的 cookie;它们仅出现在 CORS 请求/响应中。
    • @monsour:拦截了与 WireShark 的整个 HTTP 会话。 Set-Cookie 标头存在于服务器响应中,但客户端在下一次请求时不会设置会话 ID。
    • 这是否类似于the issue I'm having
    【解决方案2】:

    虽然我还没有找到任何与原始问题相关的解决方案,但我已经能够通过为 ASP.NET 会话和身份验证工件实现自定义传输来克服它。

    一般来说,在我的解决方案中,所有 ASP.NET 工件都作为附加到响应内容的 JSON 字符串从服务器传输到客户端,并从客户端传输到服务器 - 作为自定义 HTTP 标头。

    不确定我这样做是不是重新发明了轮子,但至少它有效......

    【讨论】:

      【解决方案3】:

      确保您的 Chrome 地址栏中没有此图标。他们开始阻止来自其他域的 cookie,因此您的会话 ID 丢失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2012-01-17
        • 2015-12-22
        • 2012-07-17
        • 2020-04-02
        • 1970-01-01
        相关资源
        最近更新 更多