基于.Net Core中的appSettings使用Cors

6

我正在将一个.Net 4.5.2项目更新为.Net Core Web API。目前,根据appSetting的值 CorsAllowAll,Cors设置如下:

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 core 中实现相同的功能?不幸的是,我不知道每个环境的URL。但我知道对于本地、DEV和QA环境,appSetting CorsAllowAll 是 true。但是对于UAT和PROD环境,它将是false。

更新 我的 appSettings.json 如下:

"AppSettings": {
    ...
    "CorsAllowAll": true 
    ...
  }
2个回答

25

这个方法非常好用。WithOrigins接受一个string [],因此您可以通过;或其他方式拆分appsettings值。

appsettings.json


  {
  "AllowedOrigins": "http://localhost:8080;http://localhost:3000"
  }

启动.cs

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());
       }

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

...
"profiles": {
        "IIS Express": {
            "commandName": "IISExpress",
            "launchBrowser": true,
            "launchUrl": "api/values",
            "environmentVariables": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        },
        "Application": {
            "commandName": "Project",
            "launchBrowser": true,
            "launchUrl": "api/values",
            "applicationUrl": "http://localhost:5000;http://192.168.50.20:5000",
            "environmentVariables": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        }
    }
...

3
你也可以只使用一个数组:{ "AllowedOrigins": ["http://localhost:8080", "http://localhost:3000"] } - Tyrrrz
3
@Tyrrrz,你的评论让我陷入了一场疯狂的寻找之旅。事实证明,你不能只是简单地使用Configuration.GetValue<string[]>("AllowedOrigins"),而必须通过一些麻烦的步骤来完成它。 - Mladen Mihajlovic

4
在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”设置的值可以从“Startup.cs”中的“IConfiguration”访问。根据其值,在调用“app.UseMvc()”之前,可以在“Configure”方法中全局设置其中一个已定义的策略。
//Read value from appsettings
var corsAllowAll = Configuration["AppSettings:CorsAllowAll"] ?? "false";
app.UseCors(corsAllowAll == "true"? "CorsAllowAll" : "CorsAllowSpecific");

我的appSettings不在根级别,而是嵌套在“AppSettings”元素中。我编辑了问题以包括这一点。 - user007
此外,我的问题不仅仅是如何获取appSettings的值。而是如何根据appSetting的值使用appBuilder.useCors?我无法在.NET Core中使用ConfigureCors方法。 - user007
请编辑答案并使用Configuration["AppSettings:CorsAllowAll"]AppSettings.CorsAllowAll始终为空。 - user007
@user007 我更新了我的回答,谢谢。 - Yared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接