我在云服务器上有一个设置cookie的通用处理程序(cookiecutter.ashx(。我需要从本地生产服务器读取此cookie。云服务器使用生产服务器上域的子域(例如,处理程序位于cloudserver.example.com,生产服务器为www.example.com(。cookie的域设置为";。example.com";。如果我在浏览器中直接浏览到cookiecutter.ashx,则会创建cookie并在浏览器cookie集合中可见(使用Chrome DevTools(,并且我可以从www.example.com读取cookie。但是,如果我从www.example.com.axample.com对处理程序进行ajax调用(JQuery(,则cookie无法从www.example.com.cn读取,也不会出现在浏览器cookie集中。
如果我直接浏览到处理程序,为什么cookie只能从www.example.com上读取?当使用ajax调用处理程序时,是否有任何方法可以获得相同的结果?
我终于让它工作了。
当它不起作用时,我在创建cookie的服务器上有以下HTTP响应头:
Access-Control-Allow-Origin = *, Access-Control-Allow-Methods = GET, POST, OPTIONS
解决方案是:
添加以下HTTP响应标头:
Access-Control-Allow-Credentials = true
将
Access-Control-Allow-Origin
更改为https://www.example.com
(在实现Access-Control-Allow-Credentials
标头时不能使用通配符;必须指定原点(将以下参数添加到处理程序的JQueryAJAX调用中:
xhrFields: {withCredentials: true}
创建cookie时,将"安全"属性添加到cookie(cookie.Secure=true;(
将以下内容添加到创建cookie的项目的web.config文件的system.web部分:
<httpCookies sameSite=";无"/>
我还应该提到,创建cookie的项目和读取cookie的项目必须使用相同的机器密钥。
最后,如果混合使用.NET框架读取cookie,则还需要向机器密钥添加CompatabilityMode。在我的例子中,所有的框架都是.NET 2.0或更高版本,所以我使用了:compatibility Mode="compatibility";Framework20SP2";
更多关于compatibilityMode的信息,请点击此处:https://learn.microsoft.com/en-us/dotnet/api/system.web.configuration.machinekeysection.compatibilitymode?view=netframework-4.8