Cookie可以从HttpResponseMessage中看到,但在Javascript中不可见

时间:2017-10-27 17:56:03

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

我有一个登录服务,在我登录时将用户登录信息传递给我的应用程序。这将在成功登录时调用我的应用程序的第一页。用户信息作为此请求中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。 下面是我用来读取角度js中的cookie的代码。

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:6)

出于安全原因,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。