【问题标题】:Cookies visible from HttpResponseMessage but not in Javascript从 HttpResponseMessage 中可见但在 Javascript 中不可见的 Cookie
【发布时间】:2018-04-09 09:45:10
【问题描述】:

我有一个登录服务,它在我登录时将用户登录信息传递给我的应用程序。这将在成功登录时调用我的应用程序的第一页。用户信息在此请求中作为 cookie 的一部分传递。

我正在尝试使用以下代码从我的 Web API 请求中的请求中读取这些 cookie。

 CookieHeaderValue getAccessUserInfo = request.Headers.GetCookies("GAUSERINFO").FirstOrDefault();

                if (getAccessUserInfo != null)
                {
                    userInfo = getAccessUserInfo["GAUSERINFO"].Values.Get("corporate_id");
                    Logger.Info(string.Format("User Cookie {0}", userInfo));
                    return userInfo;
                }

但如果我尝试从 javascript 或 angular js 读取相同的 cookie,我无法在集合中看到该 cookie。 下面是我用来读取 Angular js 中的 cookie 的代码。

console.log($document[0].cookie);

这是我可以从结果中看到的 cookie。我期待的 cookie 是 GAUSERINFO 以及以下 cookie。

有没有办法从 Angular js 读取这些 cookie,或者至少将该请求正文传递给 API,以便我可以使用 C# 代码在我的 API 中读取 cookie。

【问题讨论】:

    标签: javascript c# angularjs asp.net-web-api cookies


    【解决方案1】:

    出于安全原因,JavaScript 无法访问仅 HTTP cookie。为了防止XSS attacks,一般用户会话/登录信息应该只是HTTP。如果攻击者要获取用户的会话信息,他们可以冒充用户。如果您想向客户端公开corporate_id 之类的用户信息,可以将其放在未标记为 HttpOnly 的单独 cookie 中。

    来自MSDN for HttpCookie.HttpOnly

    被盗 cookie 可能包含识别用户的敏感信息 到站点,例如 ASP.NET 会话 ID 或表单身份验证 票,并且可以被攻击者重放以伪装成 用户或获取敏感信息。当 HttpOnly cookie 是 由兼容的浏览器接收,客户端无法访问 脚本。

    要使用 corporate_id 客户端,请创建一个单独的 cookie,其中包含客户端所需的唯一信息,当您在 C# 代码中创建它时,请务必将 HttpOnly 设置为 false。

    编辑:如果您的用例是使用 Angular 的 $http 服务将 cookie 转发到您的 API,那么您可以为它做一些额外的配置,在这个答案中有详细说明:https://stackoverflow.com/a/17065576/6950124

    总结是您需要设置$httpProvider.defaults.withCredentials = true; 并可能还配置您的Web 服务器以在浏览器最初请求页面时发回标头Access-Control-Allow-Credentials: true。这让浏览器知道您的 JavaScript 代码可以部分访问 HttpOnly cookie。

    如果您已正确配置所有内容,则进行 AJAX 调用的底层浏览器代码应转发 HttpOnly cookie。

    【讨论】:

    • 我无法控制向我发送 cookie 的服务。如果可能的话,我正在尝试找到一种方法,至少通过浏览器将内容转发到我的 api。
    • HttpOnly 是你的问题。它是 HttpOnly 来阻止你正在尝试做的事情。
    • @AshwiniMaddala 请查看我的答案的编辑。您可以配置 Angular 和您的 Web 服务器以使其正常工作,而无需直接访问 JavaScript 代码中的 cookie。
    • 感谢@KevinSecrist。登录服务在整个组织中使用,并且不能针对每种情况进行定制。我最终将应用程序更改为 angular+ mvc,因为我们无法控制配置用户登录服务。
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2017-09-21
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多