Angularjs Web Api 2飞行前CORS对承载令牌的请求
我有一个带有AngularJS前端和WebAPI2后端的web应用程序,它使用承载令牌进行身份验证 FireFox和IE中的一切都很好,但在Chrome中,我的初始登录请求有时会被预先处理 以下是AngularJS服务的呼叫: $http.post(Angularjs Web Api 2飞行前CORS对承载令牌的请求,angularjs,cors,asp.net-web-api2,Angularjs,Cors,Asp.net Web Api2,我有一个带有AngularJS前端和WebAPI2后端的web应用程序,它使用承载令牌进行身份验证 FireFox和IE中的一切都很好,但在Chrome中,我的初始登录请求有时会被预先处理 以下是AngularJS服务的呼叫: $http.post(http://localhost:55483/token,数据,{标题:{'Content Type':'application/x-www-form-urlencoded'})。成功(函数(响应){…}) 飞行前请求被回退,出现“允许访问控制源”错
http://localhost:55483/token
,数据,{标题:{'Content Type':'application/x-www-form-urlencoded'})。成功(函数(响应){…})
飞行前请求被回退,出现“允许访问控制源”错误
但是,如果我再次单击登录按钮(从而重新发送上述请求),一切都很好
有没有关于如何防止/陷害/处理这种情况的想法
PS:我使用LOC
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
在
ApplicationAuthProvider.cs
文件中,将CORS allow头放在/Token请求上,在IE、FireFox和Chrome中都可以正常工作。默认情况下-访问控制最大年龄:秒数为0,请求不缓存
尝试将其设置为最大值:(Owin selfhost)。它解决了额外选项请求的问题
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
})
}
});
app.UseCors(新公司)
{
PolicyProvider=新的CorspolicProvider
{
PolicyResolver=context=>Task.FromResult(新公司策略
{
AllowAnyHeader=true,
AllowAnyMethod=true,
AllowAnyOrigin=真,
SupportsCredentials=false,
PreflightMaxAge=Int32.MaxValue/下面是一条奇特的评论:
在LeftyX于6月29日发布的帖子的帮助下解决了这个问题:
-移动
此LOCapp.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
启动.Auth.cs的配置Auth方法的第一行,
移除此LOC
context.OwinContext.Response.Headers.Add(“访问控制允许来源”,
新[]{“*”});
来自
applicationAuthProvider.cs
飞行前CORS请求它们获取
正确地处理,然后实际的请求通过
谢谢你,你救了我一整天。
因为它发生在很多人身上,我把你们的评论带到回答框,其他人可以看到。
我不想为此投票。请对我的答案发表评论
谢谢你我希望这能帮助其他人。对我来说:
- 添加
app.useCors();
LOC无效
- 添加
app.useCors();
LOC对我的团队中的其他人有效
所以我需要一个能够跨所有人的环境工作的解决方案
最终,我所做的是将标题和值添加到Web.config中,并使用以下内容(其中localhost:9000是我提供服务的节点应用程序):
然后,在生产中,您可以将原始值更改为生产前端url
如果要为所有来源启用CORS,请将该值更改为“*”
让我添加一件我今天学到的东西。此示例:
app.UseCors(CorsOptions.AllowAll);
从一开始就为我工作。我只是不知道,因为我一直在验证的请求没有以下标题:
Origin: http://hostname
Access-Control-Request-Method: GET
只有在我添加了这些之后,正确的标题才开始出现在响应中。您是否在webapi
的启动中添加了allowcors
?您的意思是LOC:app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);我试着把它放进去,但编译器说:Owin.IAppBuilder'不包含“UseCors”的定义是的,它看起来很相似,但您可能需要包含一些用于Cors的nuget软件包。在LeftyX于6月29日发布的帖子帮助下完成了此配置:移动此LOC app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);到Startup.Auth.cs的ConfigureAuth方法的第一行。然后,从GrantResourceOwnerCredentials()中删除此LOC context.OwinContext.Response.Headers.Add(“访问控制允许源代码”,新[]{“*”})方法applicationAuthProvider.cs。飞行前CORS要求他们得到正确处理,然后实际请求通过。@FancyNancy感谢FancyNancy的评论!你能把你的评论作为这个问题的答案吗?你的评论是唯一对我有效的答案!我相信其他人会喜欢指定的答案。Th尽管出于显而易见的原因,我会警告不要为所有来源启用CORS。这是最好的答案!现在可以为不同的环境设置web deploy转换。@切中要害。在我的案例中,我设置了一个web.config.staging和一个web.config.production感谢Fancy发布这个答案,这是我案例中的问题,我是se在多个位置设置cors选项。在步骤2,您可以使用context.OwinContext.Response.Headers.SetValues(“访问控制允许源代码”,allowedOriginStr);
Origin: http://hostname
Access-Control-Request-Method: GET