シナリオは簡単です。アクセストークンを取得するには、別のサーバー(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);
他に何を変更する必要がありますか?
私が見つけたものを見てください!
<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認証を行うことができます。
AngularJSベースのWebクライアント用にセットアップするには、多くの試行錯誤がありました。
私にとって、以下のアプローチはASP.NET WebApi 2.2およびOAuthベースのサービスで機能します。
Microsoft.AspNet.WebApi.Cors
nugetパッケージをインストールします。Microsoft.Owin.Cors
nugetパッケージをインストールします。config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE"));
行の上記にWebApiConfig.Register(config);
を追加します。app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
をStartup.Auth.csファイルに追加します。これは、IAppBuilder.UseWebApi
を呼び出す前に行う必要がありますここで多くのセットアップのバリエーションと組み合わせを見つけましたstackoverflowまたは ブログ記事 。したがって、ブレーズのアプローチは間違っているかもしれないし、そうでないかもしれない。それは私が思うに別の設定です。
これに対する多くのさまざまな解決策を何時間も検索して調べた後、私はこれを以下のように機能させることができました。
これにはいくつかの理由があります。ほとんどの場合、間違った場所でCORSが有効になっているか、2回有効になっているか、まったく有効になっていません。
Web APIとOwinトークンエンドポイントを使用している場合、Web APIメソッドでCORSへのすべての参照を削除し、適切なowinメソッドを追加する必要があります。これは、Web API corsはトークンエンドポイントでは機能しませんが、Owin corsは両方のWeb APIおよびトークン認証のエンドポイントなので、開始できます。
Owin Corsパッケージがインストールされていることを確認しますeg.config.EnableCors();がある行を削除します。 WebAPIconfig.csファイルから
Startup.csファイルに移動し、他の設定を実行する前にOwin Corsを実行してください。
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); ConfigureAuth(app);
それでも問題が発生する場合は、Startup.Auth.csに移動し、ConfigureAuthメソッドに次のものがあることを確認します(startup.csファイルが正しい場合、これは必要ありません)
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
<appSettings>
<add key="cors:Origins" value="*" />
<add key="cors:Headers" value="*" />
<add key="cors:Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</appSettings>
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(...)
を呼び出す必要があります。
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);
}
私の答えは
ベアラートークンのWeb Api 2プリフライトCORSリクエスト
具体的には、OAuthAuthorizationServerProvider.GrantResourceOwnerCredentialsの実装を使用した/ Tokenリクエストがヘッダーを再度追加していました。 OWIN CORSのものを他のOWIN構成の前に追加し、そのリンクに従って、GrantResourceOwnerCredentialsからヘッダーを削除します。幸運を。
私は自分の経験を共有したいだけです。私は一日の半分を頭にぶつけて、それを機能させようとしました。多数の記事とSO質問を読み、最終的には何が間違っていたかを見つけました。
この線
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Startup
class Configuration
メソッドの最初のものではありませんでした。トップに移動すると、すべてが魔法のように動き始めました。
web.config
やconfig.EnableCors(corsPolicy);
などのカスタムヘッダーは必要ありませんでした。
これが誰かの時間の節約に役立つことを願っています。
ここでは、さまざまなスコープで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>
この構成は、その種類によっては新しいプロジェクトを作成するときにデフォルトで設定される場合がありますが、最初から始める場合はおそらくこの構成を追加する必要があります。
カスタマーヘッダーを追加しても、セキュリティニーズを自由にカスタマイズできるとは限りません。 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 の指示に従ってください。
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
完全なソルクション。いくつかのファイルを変更するだけでいいのです。
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>