web-dev-qa-db-ja.com

Web API 2でCORS認証を作成する方法は?

シナリオは簡単です。アクセストークンを取得するには、別のサーバー(APIサーバーとは異なる)からログインする必要があります。

APIサーバーにMicrosoft.Owin.Corsパッケージをインストールしました。 Startup.Auth.csファイルのpublic void ConfigureAuth(IAppBuilder app)の下に、

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

WebApiConfig.cspublic static void Register(HttpConfiguration config)の下に、次の行を追加しました。

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

他に何を変更する必要がありますか?

71
Blaise

私が見つけたものを見てください!

<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認証を行うことができます。

78
Blaise

AngularJSベースのWebクライアント用にセットアップするには、多くの試行錯誤がありました。
私にとって、以下のアプローチはASP.NET WebApi 2.2およびOAuthベースのサービスで機能します。

  1. Microsoft.AspNet.WebApi.Cors nugetパッケージをインストールします。
  2. Microsoft.Owin.Cors nugetパッケージをインストールします。
  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または ブログ記事 。したがって、ブレーズのアプローチは間違っているかもしれないし、そうでないかもしれない。それは私が思うに別の設定です。

47
Youngjae

これに対する多くのさまざまな解決策を何時間も検索して調べた後、私はこれを以下のように機能させることができました。

これにはいくつかの理由があります。ほとんどの場合、間違った場所でCORSが有効になっているか、2回有効になっているか、まったく有効になっていません。

Web APIとOwinトークンエンドポイントを使用している場合、Web APIメソッドでCORSへのすべての参照を削除し、適切なowinメソッドを追加する必要があります。これは、Web API corsはトークンエンドポイントでは機能しませんが、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ファイルが正しい場合、これは必要ありません)

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

30
Piotr Stulinski

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 Identityを構成する前に、app.UserCors(...)を呼び出す必要があります。

ソース: ASP.NET Web Application Starter Kit (ASP.NET Web API、Identity、SignalR)

21

Youngjaeの答えを詳しく説明するには、Web APIを使用してOWINをセットアップし、そのプロセスでCORSを有効にするための素晴らしいチュートリアルがあります http://bitoftech.net/2014/06/01/token-based-authentication-asp- net-web-api-2-owin-asp-net-identity /

次のコマンドを使用して、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);
}
14
Yaron

私の答えは

ベアラートークンのWeb Api 2プリフライトCORSリクエスト

具体的には、OAuthAuthorizationServerProvider.GrantResourceOwnerCredentialsの実装を使用した/ Tokenリクエストがヘッダーを再度追加していました。 OWIN CORSのものを他のOWIN構成の前に追加し、そのリンクに従って、GrantResourceOwnerCredentialsからヘッダーを削除します。幸運を。

9
Dale Holborow

私は自分の経験を共有したいだけです。私は一日の半分を頭にぶつけて、それを機能させようとしました。多数の記事とSO質問を読み、最終的には何が間違っていたかを見つけました。

この線

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

Startup class Configurationメソッドの最初のものではありませんでした。トップに移動すると、すべてが魔法のように動き始めました。

web.configconfig.EnableCors(corsPolicy);などのカスタムヘッダーは必要ありませんでした。

これが誰かの時間の節約に役立つことを願っています。

9
Andrew

ここでは、さまざまなスコープで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>

この構成は、その種類によっては新しいプロジェクトを作成するときにデフォルトで設定される場合がありますが、最初から始める場合はおそらくこの構成を追加する必要があります。

4
Seba Cervantes

カスタマーヘッダーを追加しても、セキュリティニーズを自由にカスタマイズできるとは限りません。 APIの他のすべての部分を世界に開放します。次のコードは「トークン」に対してのみそれを行い、コントローラーの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 の指示に従ってください。

2
Tim Hong

OWINミドルウェアを使用してCORSを処理する場合、WebAPIConfigまたはweb.configファイルにヘッダーを追加する必要はありません。はい、web.configファイルにヘッダーを追加してもパブリックアクセスが必要な場合は機能しますが、ホワイトリスト(ドメイン)に基づいてアクセスを制限する必要がある場合は、Allアクセスはあなたがしたいことではなくなりました。

OWINSでは、このハンドラーを実装することでこれを処理できます。

OAuthAuthorizationServerProvider.MatchEndpoint

このハンドラーを使用して、リクエストメソッド(OPTIONS、POST ...)を検出し、リクエストをAuthorizeまたはTokenエンドポイントとして処理する必要があるかどうかを検出できます。これは、ロジックを追加して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

1
ozkary

完全なソルクション。いくつかのファイルを変更するだけでいいのです。

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>
0
Jonas Ribeiro