ASP.NET Core Web APIでクロスオリジンリソース共有を有効にしようとしていますが、動けなくなります。
EnableCors
属性は、パラメータとしてpolicyName
型のstring
を受け入れます。
// Summary:
// Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
// policyName:
// The name of the policy to be applied.
public EnableCorsAttribute(string policyName);
policyName
とはどういう意味ですか?またASP.NET Core Web APIでCORSを構成するにはどうすればよいですか。
アプリケーションの起動時にConfigureServices
メソッドでCORSポリシーを設定する必要があります。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
CorsPolicyBuilder
のbuilder
を使用すると、必要に応じてポリシーを設定できます。この名前を使用して、ポリシーをコントローラとアクションに適用できます。
[EnableCors("MyPolicy")]
またはそれをすべてのリクエストに適用します。
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
}
これは.Net-Core 1.1
用です
残念ながら、この特定のケースではドキュメントは非常に混乱します。だから私はそれを簡単にするつもりだ:
Microsoft.AspNetCore.Cors
nugetパッケージを追加しますConfigureServices
メソッドにservices.AddCors();
を追加しますConfigure
メソッドで、app.UseMvc()
およびapp.UseStaticFiles()
を呼び出す前に、次のコードを追加してください。
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
それでおしまい。すべてのクライアントがあなたのASP.NET Core Webサイト/ APIにアクセスできます。
.Net-Core 2.0
の場合
Microsoft.AspNetCore.Cors
nugetパッケージを追加しますConfigureServices
メソッドで、services.AddMvc()
を呼び出す前に、以下を追加します。
services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
Configure
メソッドで、app.UseMvc()
を呼び出す前に、app.UseCors("AllowAll");
を追加します。
AllowAll
はapp.UserCorsで言及する必要があるポリシー名です。どんな名前でもかまいません。
に基づいて Henk's answer 私は特定のドメイン、許可したい方法、そしてCORSを有効にしたいヘッダを考え出すことができました。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
使用法:
[EnableCors("AllowSpecific")]
Startup.csクラスで設定する必要があります
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
特にSignalRを使ったdotnet core 2.2では変更しなければなりません
.WithOrigins("http://localhost:3000")
または
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
代わりに.AllowAnyOrigin()
と.AllowCredentials()
https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/
IISでホスティングしている場合、考えられる理由の1つは、IISがOPTIONS
動詞をブロックしているためです。このため、私はほぼ1時間費やしました。
1つのわかりやすい指示は、OPTIONS
リクエスト中に404
エラーが発生していることです。
これを修正するには、OPTIONS
リクエストをブロックするように明示的にIISではなくに指示する必要があります。
リクエストフィルタリングに行きます:
OPTIONSが許可されていることを確認してください。
または、以下の設定でweb.config
を作成してください:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
`
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAnyOrigin",
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
});
services.Configure<MvcOptions>(options => {
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
});
}
`