これは Access-Control-Allow-Originヘッダーの仕組み の複製になりますが、そこのメソッドも機能していません。私は何かが足りないことを望んでいます。
AJAX経由でアクセスしている.NET Core Web APIからの応答で_Access-Control-Allow-Origin
_ヘッダーを取得しようとしています。
私はいくつかのことを試しました。特に明記しない限り、すべては_Startup.cs
_ファイルに含まれています。
方法1
Microsoftドキュメント に従って:
_public void ConfigureServices(IServiceCollection services)
{
// Add database
services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection")));
// Add the ability to use the API with JSON
services.AddCors();
// Add framework services.
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<DbContext>().Database.Migrate();
serviceScope.ServiceProvider.GetService<DbContext>().EnsureSeedData();
}
}
app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod());
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
Audience = Configuration["Authentication:AzureAd:Audience"],
});
app.UseMvc();
}
_
方法2
_public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddCors(options => options.AddPolicy("AllowWebApp",
builder => builder.AllowAnyMethod()
.AllowAnyMethod()
.AllowAnyOrigin()));
//.WithOrigins("https://localhost:44306")));
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseCors("AllowWebApp");
// ...
}
_
また、コントローラーとメソッドの両方に[EnableCors("AllowWebApp")]
を追加しようとしました。
郵便配達員から、私は次のものを受け取ります:
コンテンツエンコード→gzip
content-type→text/plain; charset = utf-8
date→Wed、25 Jan 2017 04:51:48 GMT
サーバー→ケストレル
ステータス→200
vary→Accept-Encoding
x-powered-by→ASP.NET
x-sourcefiles→=?UTF-8?B?[編集済み]
Chromeでも試してみて、同様のヘッダーを取得しました。
問題があれば、アクセスしようとしているメソッドにはAuthorize
属性があります。しかし、その部分は正常に動作するはずです(少なくとも良い反応を得ています)
だから、私は非常に明白な何かを見逃していますか、これは壊れましたか?現在、バージョン1.1.0を実行しています。
JSおよびコントローラースタブの追加を編集
_function getContactPreviews(resultsCallback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = () => {
if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) {
resultsCallback(JSON.parse(xmlhttp.response));
}
}
xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true);
xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken"));
xmlhttp.send();
}
_
コントローラースタブ
_[Authorize]
[Route("api/[controller]")]
public class UserController : ApiController
{
[HttpGet(nameof(ContactsPreview))]
[EnableCors("AllowWebApp")]
public IEnumerable<Customer> ContactsPreview()
{
// ...
}
}
_
問題は、Bearer認証(または私が想像するもの)を使用する場合、ヘッダー「Authorization」を追加し、セットアップでそのヘッダーが許可されている場合にのみサーバーが許可することです。
この問題を解決するには2つの方法がありますが、以下にonlyコードが必要です。 Web APIソリューションの_Startup.cs
_のConfigure()
メソッドに入ります。
方法1:すべてのヘッダーを許可
_app.UseCors(builder => builder.WithOrigins("https://localhost:44306")
.AllowAnyMethod()
.AllowAnyHeader());
_
方法2:特定のヘッダーを許可する
_app.UseCors(builder => builder.WithOrigins("https://localhost:44306")
.AllowAnyMethod()
.WithHeaders("authorization", "accept", "content-type", "Origin"));
_
追加のヘッダーは、ドキュメントごとに次のとおりです。
ブラウザは、Access-Control-Request-Headersの設定方法が完全に一貫しているわけではありません。ヘッダーを「*」以外に設定する場合は、少なくとも「accept」、「content-type」、および「Origin」に加えて、サポートするカスタムヘッダーを含める必要があります。
Access-Control-Allow-Originヘッダーは、次の場合にのみ返されます。
次に、サーバーは、Origin URLを値としてACAOヘッダーを返します。
Originヘッダーは通常、XMLHttpRequestオブジェクトによって設定されます。
詳細については、「 CORSの仕組み 」を参照してください
Startup.csファイルに、次を追加します
public CorsPolicy GenerateCorsPolicy(){
var corsBuilder = new CorsPolicyBuilder();
corsBuilder.AllowAnyHeader();
corsBuilder.AllowAnyMethod();
corsBuilder.AllowAnyOrigin(); // For anyone access.
//corsBuilder.WithOrigins("http://localhost:56573"); // for a specific url. Don't add a forward slash on the end!
corsBuilder.AllowCredentials();
return corsBuilder.Build();
}
ConfigureServicesメソッドで:
services.AddCors(options =>
{
options.AddPolicy("AllowAllOrigins", GenerateCorsPolicy());
});
// CORSをアプリケーション全体にグローバルに適用するには// Configureメソッドで、
app.UseCors("AllowAllOrigins");
[DisableCors]
DisableCors属性を使用して、コントローラーまたはアクションのCORSを無効にできます。
// CORSコントローラベースを有効にするには-グローバルに適用する場合、これは必要ありません。
[EnableCors("AllowAllOrigins")]
public class HomeController: Controller {}