我们计划支持将远程登录表单集成到我们的应用程序中。为此,我提供了一个启用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
可以登录。
只改变我们的测试环境,上面描述的系统没有问题。似乎某些安全约束正在影响浏览器是否将cookie传输到目标应用程序。特别是Dennis C.提到的第三方Cookie政策听起来很合理。
答案 0 :(得分:1)
缺少过期日期意味着您正在创建所谓的仅会话cookie。关闭与应用程序的连接可能导致cookie被清除。
这是这样创建的:
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:
答案 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
httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
(*)用于来自任何域的接受请求。你只接受特定的域名,你会检查
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保存它对于安全原因是不可能的。
参考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,与您设置的方式相同。我希望这对你有帮助。