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

时间:2013-11-19 19:00:32

标签: asp.net-web-api cors

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

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

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

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

// Cors
var cors = new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS");
config.EnableCors(cors);

我还应该改变什么?

11 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:44)

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

  1. 安装Microsoft.AspNet.WebApi.Cors nuget包。
  2. 安装Microsoft.Owin.Cors nuget包。
  3. config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE"));添加到 Startup.cs 文件的WebApiConfig.Register(config);行的上方。
  4. app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);添加到 Startup.Auth.cs 文件中。这必须在致电IAppBuilder.UseWebApi
  5. 之前完成
  6. 删除Blaise所做的任何xml设置。
  7. 我在此处发现了许多设置变体和组合stackoverflow或blog articles。所以,布莱斯的方法可能会或可能不会错。这只是我想的另一种设置。

答案 2 :(得分:29)

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

这种情况有很多原因。很可能你在错误的地方启用了CORS,或者启用了两次或根本没启用。

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

  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文件正确,则不需要此内容)

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

答案 3 :(得分: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>

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);
}

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

来源:ASP.NET Web Application Starter Kit(ASP.NET Web API,Identity,SignalR)

答案 4 :(得分:11)

详细说明Youngjae的答案,有一个很棒的教程,关于使用Web API设置OWIN并在http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

过程中启用CORS

您需要使用以下命令添加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);
}

答案 5 :(得分:9)

我的回答是在

找到的

Web Api 2 Preflight CORS request for Bearer Token

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

答案 6 :(得分:9)

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

该行

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

不是StartupConfiguration方法中的第一个。当我把它移到顶端时 - 一切都开始变得神奇了。

web.configconfig.EnableCors(corsPolicy);或其他任何内容都不需要自定义标头。

希望这可以帮助别人节省一些时间。

答案 7 :(得分:3)

您可以在此处找到在不同范围内启用CORS的多种方法:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

无论如何,我遇到了同样的问题,并且以不同的方式添加标题并没有获得完整的解决方案。

我发现IIS使用的处理程序会覆盖您的CORS Web应用程序配置,如果您没有指定相反的情况。

就我而言,我还必须通过在我的应用程序的主Web.config中添加以下配置来删除IIS处理程序的使用:

<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

请注意,根据其类型创建新项目时,默认情况下可能会设置此配置,但如果从头开始,则可能需要添加此配置。

答案 8 :(得分:2)

添加客户标题可能无法自由地定制您的安全需求。它打开了世界的所有其他部分。以下代码仅对“token”执行此操作,而api的控制器其他部分应通过EableCors注释完成。

public void ConfigureAuth(IAppBuilder app)
{
    //other stuff
    app.Use(async (context, next) =>
    {
        IOwinRequest req = context.Request;
        IOwinResponse res = context.Response;
        if (req.Path.StartsWithSegments(new PathString("/Token")))
        {
            var origin = req.Headers.Get("Origin");
            if (!string.IsNullOrEmpty(origin))
            {
                res.Headers.Set("Access-Control-Allow-Origin", origin);
            }
            if (req.Method == "OPTIONS")
            {
                res.StatusCode = 200;
                res.Headers.AppendCommaSeparatedValues("Access-Control-    Allow-Methods", "GET", "POST");
                res.Headers.AppendCommaSeparatedValues("Access-Control-    Allow-Headers", "authorization", "content-type");
                return;
            }
        }
        await next();
    });
    //other stuff
}

要启用Cors,请按照here指示进行操作。

答案 9 :(得分:1)

使用OWIN中间件处理CORS时,我们不需要在WebAPIConfig或web.config文件中添加标头。是的,在您希望公开访问时,在web.config文件中添加标题确实有效,但如果您需要根据白名单(域)限制访问权限,则允许所有访问权限不再是你想做什么。

使用OWINS,我们可以通过实现此处理程序来处理这个问题:

OAuthAuthorizationServerProvider.MatchEndpoint

使用此处理程序,我们可以检测请求方法(OPTIONS,POST ...)以及是否应将请求视为授权或令牌端点。这是可以添加逻辑以检查Origin标头(请求)并通过添加响应标头Access-Control-Allow-Origin验证是否应该允许此域的区域。

string origin = context.Request.Headers.Get("Origin");
var found = IsDomainAllowed(origin);
 if (found){
      context.Response.Headers.Add("Access-Control-Allow-Origin",
                             new string[] { origin });
 }      

有关此问题的更多背景信息,请查看以下链接:http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html

答案 10 :(得分:0)

完成解决方案。你只需要改变一些文件,对我有用。

<强> Global.ascx

public class WebApiApplication : System.Web.HttpApplication {
    protected void Application_Start()
    {
        WebApiConfig.Register(GlobalConfiguration.Configuration);
    } }

<强> WebApiConfig.cs

所有请求都已调用此代码。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
        AddRoutes(config);
    }

    private static void AddRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "api/{controller}/"
        );
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute(
            origins: "*", 
            headers: "*", 
            methods: "*");
        config.EnableCors(cors);
    } }

某些控制器

无需改变。

<强>的Web.config

您需要在web.config中添加处理程序

<configuration> 
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>   
  </system.webServer> 
</configuration>