在Generic Handler中创建的Cookie在直接浏览到处理程序时可见,但在从aspx页面(c#/.NET)调用



我在云服务器上有一个设置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

解决方案是:

  1. 添加以下HTTP响应标头:

    Access-Control-Allow-Credentials = true
    
  2. Access-Control-Allow-Origin更改为https://www.example.com(在实现Access-Control-Allow-Credentials标头时不能使用通配符;必须指定原点(

  3. 将以下参数添加到处理程序的JQueryAJAX调用中:

    xhrFields: {withCredentials: true}
    
  4. 创建cookie时,将"安全"属性添加到cookie(cookie.Secure=true;(

  5. 将以下内容添加到创建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

相关内容

  • 没有找到相关文章

最新更新