Используйте Cors на основе appSettings в .Net Core - PullRequest
0 голосов
/ 22 мая 2018

Я обновляю проект .net 4.5.2 до .Net core web api.Прямо сейчас Cors настроен, как показано ниже, на основе значения appSetting CorsAllowAll:

if ((ConfigurationManager.AppSettings["CorsAllowAll"] ?? "false") == "true")
{
    appBuilder.UseCors(CorsOptions.AllowAll);
}
else
{
    ConfigureCors(appBuilder);
}

private void ConfigureCors(IAppBuilder appBuilder)
{
    appBuilder.UseCors(new CorsOptions
    {
    PolicyProvider = new CorsPolicyProvider
    {
        PolicyResolver = context =>
        {
           var policy = new CorsPolicy();
           policy.Headers.Add("Content-Type");
           policy.Headers.Add("Accept");
           policy.Headers.Add("Auth-Token");
           policy.Methods.Add("GET");
           policy.Methods.Add("POST");
           policy.Methods.Add("PUT");
           policy.Methods.Add("DELETE");
           policy.SupportsCredentials = true;
           policy.PreflightMaxAge = 1728000;
           policy.AllowAnyOrigin = true;
           return Task.FromResult(policy);
        }
    }
    });
}

Как я могу добиться того же в ядре .net?К сожалению, я не буду знать URL-адреса каждой среды.Но я знаю, что для локальных сред, DEV и QA appSetting CorsAllowAll верен.Но в средах UAT и PROD это было бы неверно.

ОБНОВЛЕНИЕ Мой appSettings.json похож на ниже:

"AppSettings": {
    ...
    "CorsAllowAll": true 
    ...
  }

1 Ответ

0 голосов
/ 22 мая 2018

В методе ConfigureServices определите две политики, а именно CorsAllowAll и CorsAllowSpecific

services.AddCors(options =>
            {
                options.AddPolicy("CorsAllowAll",
                    builder =>
                    {
                        builder
                        .AllowAnyOrigin() 
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials();
                    });                    

                options.AddPolicy("CorsAllowSpecific",
                    p => p.WithHeaders("Content-Type","Accept","Auth-Token")
                        .WithMethods("POST","PUT","DELETE")
                        .SetPreflightMaxAge(new TimeSpan(1728000))
                        .AllowAnyOrigin()
                        .AllowCredentials()
                    ); 
            });

Доступ к значению CorsAllowAll можно получить из IConfiguration в файле Startup.cs.В зависимости от его значения, можно задать одну из определенных политик глобально в методе Configure перед вызовом app.UseMvc().

//Read value from appsettings
var corsAllowAll = Configuration["AppSettings:CorsAllowAll"] ?? "false";
app.UseCors(corsAllowAll == "true"? "CorsAllowAll" : "CorsAllowSpecific");
...