首页 文章

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

提问于
浏览
18

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

3 回答

  • 4

    默认情况下 - 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
                        })
                    }
                });
    
  • 2

    以下是花式评论:

    在LeftyX 6月29日的帖子的帮助下想出这个: - 移动这个LOC app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); Startup.Auth.cs的ConfigureAuth方法中的第一行 . - 然后,删除此LOC context.OwinContext.Response.Headers.Add(“Access-Control-Allow-Origin”,new [] {“*”});来自ApplicationOAuthProvide.cs的GrantResourceOwnerCredentials()方法 . 预检CORS-请求他们得到妥善处理,然后实际的requet通过

    谢谢你,你救了我一整天 .
    因为很多人都会发生这种情况,我把你的评论带到答案框中,其他人都可以看到它 .

    I don't want to get vote up for this. Please comment on my answer instead

    谢谢

  • 17

    我希望这能够帮助那里的人 . 为了我:

    • 添加 app.useCors(); LOC无法正常工作 .

    • 添加 app.useCors(); LOC适用于我团队中的其他人 .

    所以我需要一个适用于每个人环境的解决方案 .

    最终我最终做的是将 Headers 和值添加到 Web.config 中,并使用以下内容(其中localhost:9000是我的节点应用程序,提供角度):

    <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,请将值更改为 "*" .

相关问题