我有一个登录服务,在我登录时将用户登录信息传递给我的应用程序。这将在成功登录时调用我的应用程序的第一页。用户信息作为此请求中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。
有没有办法从角度js或请求正文的至少传递中读取这些cookie,以便我可以使用C#代码在API中读取cookie。
答案 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。