基于 .Net Core 中的 appSettings 使用 Cors

use*_*007 2 c# cors asp.net-core-webapi asp.net-core-2.1

我正在将 .net 4.5.2 项目更新为 .Net 核心 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);
        }
    }
    });
}
Run Code Online (Sandbox Code Playgroud)

如何在 .net core 中实现相同的目标?不幸的是,我不会知道每个环境的 URL。但我知道对于本地、DEV 和 QA 环境,appSettingCorsAllowAll是正确的。但是在 UAT 和 PROD 环境中它会是假的。

更新 我的 appSettings.json 如下所示:

"AppSettings": {
    ...
    "CorsAllowAll": true 
    ...
  }
Run Code Online (Sandbox Code Playgroud)

las*_*ink 12

这个方法效果很好。WithOrigins接受一个字符串 [],因此您可以通过;或其他方式拆分 appsettings 值。

appsettings.json


  {
  "AllowedOrigins": "http://localhost:8080;http://localhost:3000"
  }
Run Code Online (Sandbox Code Playgroud)

启动文件


  {
  "AllowedOrigins": "http://localhost:8080;http://localhost:3000"
  }
Run Code Online (Sandbox Code Playgroud)

这种分号格式的主要原因是因为它类似于 Application\Properties\launchSettings.json

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationDbContext dbContext, IOptions<AppSettings> appSettings)

if (!String.IsNullOrEmpty(_appSettings.AllowedOrigins))
       {
          var origins = _appSettings.AllowedOrigins.Split(";");
          app.UseCors(x => x
                    .WithOrigins(origins)
                    .AllowAnyMethod()
                    .AllowCredentials()
                    .AllowAnyHeader());
       }
Run Code Online (Sandbox Code Playgroud)

  • @Tyrrrz 男孩,你的评论让我陷入了徒劳的追逐中。事实证明,你不能只是 `Configuration.GetValue&lt;string[]&gt;("AllowedOrigins")` 并且你必须跳过一些[圈子才能做到这一点](/sf/ask/2893037591/ net-core-get-json-array-using-iconfiguration)。 (3认同)
  • 您也可以只使用数组: ```json { "AllowedOrigins": ["http://localhost:8080", "http://localhost:3000"] } ``` (2认同)

Yar*_*red 5

在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()
                    ); 
            });
Run Code Online (Sandbox Code Playgroud)

CorsAllowAll可以从 Startup.cs 中访问设置值IConfiguration。根据其值,可以在Configure调用之前在方法中全局设置已定义的策略之一app.UseMvc()

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