Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Web Api 2飞行前CORS对承载令牌的请求_Angularjs_Cors_Asp.net Web Api2 - Fatal编程技术网

Angularjs Web Api 2飞行前CORS对承载令牌的请求

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'})。成功(函数(响应){…}) 飞行前请求被回退,出现“允许访问控制源”错

我有一个带有AngularJS前端和WebAPI2后端的web应用程序,它使用承载令牌进行身份验证

FireFox和IE中的一切都很好,但在Chrome中,我的初始登录请求有时会被预先处理

以下是AngularJS服务的呼叫:

$http.post(
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日发布的帖子的帮助下解决了这个问题:
-移动 此LOC
app.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