Вы можете создать пользовательское промежуточное ПО, которое проверяет политики на основе источника запроса.
public class CustomCorsMiddleware
{
private readonly RequestDelegate _next;
private readonly ICorsService _corsService;
private readonly ICorsPolicyProvider _corsPolicyProvider;
private readonly IDictionary<string, string> _policies;
public CustomCorsMiddleware(
RequestDelegate next,
ICorsService corsService,
ICorsPolicyProvider policyProvider,
IDictionary<string, string> policies)
{
_next = next ?? throw new ArgumentNullException(nameof(next));
_corsService = corsService ?? throw new ArgumentNullException(nameof(corsService));
_corsPolicyProvider = policyProvider ?? throw new ArgumentNullException(nameof(policyProvider));
_policies = policies;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Headers.ContainsKey(CorsConstants.Origin))
{
string policyName;
bool hasPolicy = this._policies.TryGetValue(context.Request.Headers[CorsConstants.Origin], out policyName);
if (!String.IsNullOrEmpty(policyName) && hasPolicy)
{
CorsPolicy corsPolicy = await _corsPolicyProvider.GetPolicyAsync(context, policyName);
if (corsPolicy != null)
{
var corsResult = _corsService.EvaluatePolicy(context, corsPolicy);
_corsService.ApplyResult(corsResult, context.Response);
var accessControlRequestMethod = context.Request.Headers[CorsConstants.AccessControlRequestMethod];
if (string.Equals(
context.Request.Method,
CorsConstants.PreflightHttpMethod,
StringComparison.OrdinalIgnoreCase) &&
!StringValues.IsNullOrEmpty(accessControlRequestMethod))
{
// Since there is a policy which was identified,
// always respond to preflight requests.
context.Response.StatusCode = StatusCodes.Status204NoContent;
return;
}
}
}
}
await _next(context);
}
}
В ваших файлах Startup.cs вы должны определить политики и предоставить сопоставления для промежуточного программного обеспечения.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(opt => {
opt.AddPolicy(
"ABC",
builder => {
builder.WithOrigins("abc.com")
.WithHeaders("A", "B");
}
);
opt.AddPolicy(
"BCD",
builder => {
builder.WithOrigins("bcd.com")
.WithHeaders("A", "C");
}
);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
IDictionary<string, string> mappings = new Dictionary<string, string>();
mappings["abc.com"] = "ABC";
mappings["bcd.com"] = "BCD";
app.UseMiddleware<CustomCorsMiddleware>(mappings);
}
Надеюсь, это поможет!