Web Api 2预警CORS请求承载令牌

时间:2014-11-17 19:20:50

标签: angularjs cors asp.net-web-api2

我有一个带有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中都可以正常工作。

4 个答案:

答案 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

只有添加了这些标题之后,正确的标题才开始出现在响应中。