重定向

时间:2017-06-23 09:13:36

标签: javascript ajax cookies cors

我们计划支持将远程登录表单集成到我们的应用程序中。为此,我提供了一个启用CORS的API调用,为我们的应用程序设置身份验证cookie。 ajax调用成功,响应包含cookie,但是一旦我将浏览器重定向到我们的应用程序,cookie就不再包含了。

我的设置包括在http://myhost/login.html上运行的登录表单,API登录调用在http://myapp:8080/login(ASP.net Web Api)上运行,应用程序本身在http://myapp/app上运行(ASP。净MVC)

ajax调用如下所示:

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://myapp:8080/login', true);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
    var resp = xhr.responseText;
    if(xhr.status == 200) {
        document.querySelector('#status').innerHTML = 'Login successful <a href="http://myapp/app">Go to MyApp</a>';
    }
    else {
        document.querySelector('#status').innerHTML = 'Login Failed : ' + xhr.statusText + '<br /><pre>' + xhr.responseText + '</pre>';
    }        
};
xhr.send(JSON.stringify({ UserName: 'User', Password: 'Pass' }));

服务器响应:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://myhost
Content-Length:0
Date:Fri, 23 Jun 2017 08:49:04 GMT
Server:Microsoft-HTTPAPI/2.0
Set-Cookie:MyAppToken=SecretToken; domain=myapp; path=/

当我直接调查Cookie(谷歌浏览器)后,我可以看到cookie设置了正确的域名和内容。但是在页面重新加载或重定向到http://myapp/app时,cookie不再设置,而且我计划的自动登录也没有开始。

当我想在AJAX通话后在应用程序上使用MyAppToken时,我还需要考虑其他事项吗?我无需访问MyAppToken上的myhost Cookie,只需要myapp可以登录。

更新(2017-07-19)

只改变我们的测试环境,上面描述的系统没有问题。似乎某些安全约束正在影响浏览器是否将cookie传输到目标应用程序。特别是Dennis C.提到的第三方Cookie政策听起来很合理。

3 个答案:

答案 0 :(得分:1)

缺少过期日期意味着您正在创建所谓的仅会话cookie。关闭与应用程序的连接可能导致cookie被清除。

enter image description here

这是这样创建的:

HttpCookie CrossAuth = new HttpCookie("MyAppToken", "SecretToken");
CrossAuth.Domain = refurl.DnsSafeHost;
Response.Cookies.Add(CrossAuth);

如果您希望Cookie保持不变,请尝试添加过期日期:

HttpCookie CrossAuth = new HttpCookie("MyAppToken", "SecretToken");
CrossAuth.Domain = refurl.DnsSafeHost;
CrossAuth.Expires = DateTime.Now.AddHours(3);
Response.Cookies.Add(CrossAuth);

哪个应该会产生如下cookie:

enter image description here

答案 1 :(得分:0)

默认情况下,除非提供某些P3P政策,否则大多数浏览器都会忽略所有第三方Cookie。

我建议你可以在https://stackoverflow.com/questions/tagged/p3p?sort=votes

上查看其他一些已回答的问题

答案 2 :(得分:0)

http://myhost/login.html上运行的登录表单,

API登录调用正在http://myapp:8080/login(ASP.net Web Api)上运行

应用程序本身位于http://myapp/app(ASP.net MVC)

在您的应用程序中使用loginform是一个域而api是另一个域而您的应用程序是另一个域。因此,访问控制不起作用

  

如果ASP net MVC Application如果是Access-Control-Allow-Origin,请参考url

     

https://enable-cors.org/server_iis7.html

httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
</httpProtocol>

(*)用于来自任何域的接受请求。你只接受特定的域名,你会检查

  

Access-control-allow-origin with multiple domains

Access-Control-Allow-Origin: {your api domain name}
Access-Control-Allow-Credentials: true

设置mvc域请求标头。

此过程是您的代码返回Server Respons在标头中有vaild cookie。此cookie是ajax请求的响应。它不存储在Web浏览器中基于域的cookie存储中。所以,我们不能使用after重定向。因为,只有基于cookie的域url存储在Web浏览器中

另一种方法是将cookie保存在同一域中的Web浏览器中。但是跨域cookie保存它对于安全原因是不可能的。 Cookie Storage image in Web Browser

参考How to set a cookie for another domain using JavaScript?

所以,在此Suitation中,您可以在获得Success响应后编写代码。

1)在mvc Controller中编写方法,用一个参数写入方法。

2)在html页面中用

设置一个表单
<form id="crossorginpostform" method="post" action="">
 <input type="hidden" id="apptoken" name="MyAppToken"/> 
</form>

在apptoken字段中设置cookie值,并根据您的mvc控制器方法的形式更新网址和javascript,发布Cookie并重定向到您需要的操作。

您收到了Cookie并根据需要在该域中重新分配Cookie。

请参阅此链接How to set a cookie for another domain

在这个地方,我们使用PHP设置来自另一个域的跨域cookie,与您设置的方式相同。我希望这对你有帮助。