如何在WebAPI 2中进行CORS身份验证?

Bla*_*ise 72 cors asp.net-web-api

场景很简单,我需要从另一台服务器(不同于API服务器)登录才能检索访问令牌.

Microsoft.Owin.Cors在API服务器上安装了包.在Startup.Auth.cs文件中,public void ConfigureAuth(IAppBuilder app)我加入了

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

WebApiConfig.cs下面public static void Register(HttpConfiguration config),我添加了以下几行:

// Cors
var cors = new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS");
config.EnableCors(cors);
Run Code Online (Sandbox Code Playgroud)

我还应该改变什么?

Bla*_*ise 78

看看我发现了什么!

在里面添加一些自定义标题<system.webServer>.

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
  </customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)

然后我可以进行CORS身份验证.

  • 这不是一个很好的解决方案.它可以工作,但它相当于关闭防火墙而不是正确配置它. (6认同)
  • 我不知道如果没有你的帖子我怎么会想到这个; 谢谢!Web API文档未提及这些配置要求... http://goo.gl/s9K6o2&http://goo.gl/G8jKG0 (4认同)
  • 不幸的是,尽管人们说不要这样做,OWIN认证管道中的一些内容是1)覆盖我已经通过context.Request.Headers编写的任何响应,作为OWIN中间件的一部分2)即使配置了自定义策略,也忽略OWIN为"/ token"请求提供服务.至少出于测试目的,我不确定我现在有多少选择. (2认同)
  • 我不同意.CORS不是任何解决方案.防火墙保护客户端,但CORS(错误)用作保护服务器的一种方式,但是请求标头的简单客户端更改,你是金色的.只需使用例如chrome --disable-web-security标志或搜索Allow-Control-Allow-Origin:*Chrome扩展程序. (2认同)

You*_*jae 47

我为基于AngularJS的Web客户端设置了很多试错法.
对我来说,下面的方法适用于ASP.NET WebApi 2.2和基于OAuth的服务.

  1. 安装Microsoft.AspNet.WebApi.Corsnuget包.
  2. 安装Microsoft.Owin.Corsnuget包.
  3. Startup.cs文件中添加config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE"));到上面的WebApiConfig.Register(config);行.
  4. 添加app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);Startup.Auth.cs文件.这必须在打电话之前完成IAppBuilder.UseWebApi
  5. 删除Blaise所做的任何xml设置.

我在这里找到了很多设置变化和组合stackoverflow或博客文章.所以,布莱斯的方法可能会或可能不会错.这只是我想的另一种设置.

  • 这可能会产生以下问题:http://aspnetwebstack.codeplex.com/workitem/1539 (4认同)
  • 我分别使用`app.UseCors`和`config.EnableCors`方法在我的OWIN和Web API配置中启用了CORS,但OWIN`/token`端点似乎是专门处理的,并没有发送Access-Control-Allow -Origin响应中的HTTP标头.即使在下面的Konstantin Tarkus实施自定义策略解决方案时也是如此. (2认同)
  • 我也必须安装`Microsoft.Owin.Cors` (2认同)

Pio*_*ski 31

经过几个小时的搜索并查看了许多不同的解决方案,我已经设法按照下面的方式工作.

这种情况有很多原因.您很可能在错误的位置启用了CORS,或者启用了两次或根本没有启用CORS.

如果您正在使用Web API和Owin Token端点,那么您需要删除Web API方法中对CORS的所有引用并添加正确的owin方法,因为web api cors将无法使用Token端点,而Owin cors将适用于两个Web API和Token auth端点让我们开始:

  1. 确保已安装Owin Cors软件包删除您拥有的任何行eg.config.EnableCors(); 从您的WebAPIconfig.cs文件

  2. 转到您的startup.cs文件,确保在任何其他配置运行之前执行Owin Cors.

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); ConfigureAuth(APP);

  3. 如果仍有问题请访问:Startup.Auth.cs并确保在ConfigureAuth方法中有以下内容(如果您的startup.cs文件正确,则不需要此项)

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

  • 谢谢@Piotr,这是真正有效的答案.Blaise可以将此标记为真正的答案吗?与所有其他答案一起,OWIN/Token或WebAPI在无法一起工作的情况下工作.在我的例子中,在Web.config和config.EnableCors(...)中添加XML会导致添加重复的标题[Access-Control-Allow-Headers],这在Chrome中是禁止的. (2认同)

Kon*_*kus 21

web.config中

<appSettings>
  <add key="cors:Origins" value="*" />
  <add key="cors:Headers" value="*" />
  <add key="cors:Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

Startup.cs

var appSettings = WebConfigurationManager.AppSettings;

// If CORS settings are present in Web.config
if (!string.IsNullOrWhiteSpace(appSettings["cors:Origins"]))
{
    // Load CORS settings from Web.config
    var corsPolicy = new EnableCorsAttribute(
        appSettings["cors:Origins"],
        appSettings["cors:Headers"],
        appSettings["cors:Methods"]);

    // Enable CORS for ASP.NET Identity
    app.UseCors(new CorsOptions
    {
        PolicyProvider = new CorsPolicyProvider
        {
            PolicyResolver = request =>
                request.Path.Value == "/token" ?
                corsPolicy.GetCorsPolicyAsync(null, CancellationToken.None) :
                Task.FromResult<CorsPolicy>(null)
        }
    });

    // Enable CORS for Web API
    config.EnableCors(corsPolicy);
}
Run Code Online (Sandbox Code Playgroud)

注意:app.UserCors(...)应在配置ASP.NET标识之前调用.

来源:ASP.NET Web应用程序入门工具包(ASP.NET Web API,身份,SignalR)


Yar*_*ron 15

为了详细说明Youngjae的答案,有一个很好的教程,关于使用Web API设置OWIN并在http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-的过程中启用CORS.API-2-owin-ASP净同一性/

您将要使用以下命令为CORS添加NuGet包:
Install-Package Microsoft.Owin.Cors -Version 2.1.0

然后加
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

到Startup.cs中的Configuration方法,它看起来像:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();
    ConfigureOAuth(app);
    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用.而且我认为最初的问题恰恰就是为什么app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 不起作用. (8认同)

Dal*_*row 9

我找到了答案

Web Api 2预检CORS对承载令牌的请求

具体来说,使用OAuthAuthorizationServerProvider.GrantResourceOwnerCredentials实现的/ Token请求再次添加标头.在任何其他OWIN配置之前添加OWIN CORS内容,并根据该链接从GrantResourceOwnerCredentials中删除标头,然后瞧.祝好运.


And*_*rew 9

我只是想分享我的经验.我花了一半的时间敲打我的脑袋,努力让它发挥作用.我阅读了很多文章和SO问题,最后我发现了什么是错的.

这条线

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

不是第一个在Startup课堂上的Configuration方法.当我把它移到顶部时 - 一切都开始神奇地工作了.

而在没有自定义页眉web.configconfig.EnableCors(corsPolicy);或其他任何东西是必要的.

希望这能帮助别人节省一些时间.