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

Ash*_*ala 0 javascript c# cookies asp.net-web-api angularjs

我有一个登录服务,当我登录时,它将用户登录信息传递给我的应用程序.这将在成功登录时调用我的应用程序的第一页.用户信息作为此请求中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;
                }
Run Code Online (Sandbox Code Playgroud)

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

console.log($document[0].cookie);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Kev*_*ist 6

出于安全原因,JavaScript无法访问仅限HTTP的Cookie.为了防止XSS攻击,通常用户会话/登录信息应该只是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.