web-dev-qa-db-ja.com

.NET Core UseCors()はヘッダーを追加しません

これは 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()
    {
        // ...
    }
}
_
14
David

問題は、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」に加えて、サポートするカスタムヘッダーを含める必要があります。

23
David

Access-Control-Allow-Originヘッダーは、次の場合にのみ返されます。

  1. 要求には「Origin」ヘッダーが含まれます。
  2. 要求されたオリジンはCORSポリシーと一致します。

次に、サーバーは、Origin URLを値としてACAOヘッダーを返します。

Originヘッダーは通常、XMLHttpRequestオブジェクトによって設定されます。

詳細については、「 CORSの仕組み 」を参照してください

7
Luis Cantero

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 {}  
1
Tejas Patel