我有一个带有AngularJS前端和Web Api 2后端的Web应用程序,它使用bearer-tokens进行身份验证。
一切都在FireFox& IE,但是使用Chrome,我的初始登录请求是SOMETIMES预先确定的。
以下是来自AngularJS服务的电话:
$ http.post(http://localhost:55483/token
,data,{headers:{'Content-Type':'application / x-www-form-urlencoded'}})。success(function(response){.. 。});
预检请求因“Allow-Access-Control-Origin”错误而被踢回。
但是,如果我再次单击“登录”按钮(从而重新发送上述请求),一切都很顺利。
关于如何预防/陷阱/处理这个的想法?
PS:我使用LOC
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
在ApplicationOAuthProvider.cs
文件中将CORS allow-header放在/ Token请求上,这在IE,FireFox和Chrome中都可以正常工作。
答案 0 :(得分:17)
以下是花哨评论:
在LeftyX于6月29日的帖子的帮助下弄清楚这一点: - 移动 这个LOC
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
到 Startup.Auth.cs 的 ConfigureAuth 方法中的第一行。
- 然后, 删除此LOC 来自 GrantResourceOwnerCredentials()方法的context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
的 ApplicationOAuthProvide.cs 即可。
预检CORS-要求他们得到 处理得当,然后真正的匆匆经过
谢谢你,你节省了我的一整天
因为很多人都会发生这种情况,我把你的评论带到答案框中,其他人都可以看到它。
我不想为此投票。请评论我的回答
谢谢
答案 1 :(得分:4)
我希望这能够帮助那里的人。对我来说:
app.useCors();
LOC无效。app.useCors();
LOC适用于我团队中的其他人。所以我需要一个适用于每个人环境的解决方案。
最终我最终要做的是使用以下将标题和值添加到 Web.config 中(其中localhost:9000是我提供角度的节点应用程序)< / EM>:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:9000" />
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
然后在生产中,您只需将原始值更改为生产前端URL。
如果要为所有来源启用CORS,请将值更改为"*"
。
答案 2 :(得分:2)
默认情况下 - Access-Control-Max-Age:秒为0,您的请求不缓存。
尝试将其设置为最大值:( Owin selfhost)。它通过额外的OPTIONS请求来解决问题
app.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context => Task.FromResult(new CorsPolicy
{
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = false,
PreflightMaxAge = Int32.MaxValue // << ---- THIS
})
}
});
答案 3 :(得分:0)
让我补充一下我今天学到的一件事。此示例:
app.UseCors(CorsOptions.AllowAll);
从一开始就为我工作。我只是不知道,因为我一直在进行验证的请求没有以下标头:
Origin: http://hostname
Access-Control-Request-Method: GET
只有添加了这些标题之后,正确的标题才开始出现在响应中。