私はCORS
ミドルウェアをそれぞれのリクエストのヘッダーを確認し、設定に基づいて許可/制限するカスタムミドルウェアに置き換えました。これは、ブラウザ間の要求とHTTPクライアント要求の両方で機能します。
ミドルウェア
public class OriginRestrictionMiddleware
{
private readonly RequestDelegate _next;
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public OriginRestrictionMiddleware(RequestDelegate next, IConfiguration configuration, ILoggerFactory loggerFactory)
{
_next = next;
_configuration = configuration;
_logger = loggerFactory.CreateLogger<OriginRestrictionMiddleware>();
}
public Task Invoke(HttpContext context)
{
try
{
var allowedOriginsConfig = _configuration.GetSection("AllowedOrigins").Value;
var allowedOrigins = allowedOriginsConfig.Split(',');
_logger.LogInformation("Allowed Origins: " + allowedOriginsConfig);
var originHeader = context.Request.Headers.Where(h => h.Key == "Origin");
if (originHeader.Any())
{
var requestOrigin = originHeader.First().Value.ToString();
_logger.LogInformation("Request Origin: " + requestOrigin);
foreach (var origin in allowedOrigins)
{
//if(origin.StartsWith(requestOrigin))
if (requestOrigin.Contains(origin))
{
return _next(context);
}
}
}
context.Response.StatusCode = 401;
return context.Response.WriteAsync("Not Authorized");
}
catch(Exception ex)
{
_logger.LogInformation(ex.ToString());
throw;
}
}
}
public static class OriginRestrictionMiddlewareExtension
{
public static IApplicationBuilder UseOriginRestriction(this IApplicationBuilder builder)
{
return builder.UseMiddleware<OriginRestrictionMiddleware>();
}
}
スタートアップコンフィギュレーション
app.UseOriginRestriction();
AppSettings.json
"AllowedOrigins": "http://localhost:55476,http://localhost:55477,chrome-extension"
012開発中にPostman
からの要求を許可するために、のエントリがあります。サーバに配備すると削除されます。
私は、この解決法を一方的にまたは別の方法でバイパスすることもできると考えています。しかし、私はそれがほとんどの場合にうまくいくと思っています。
認証またはネットワーク分離。発信者が知っているだけのものを知っている必要があるようにするか、電話をかけるために物理的に特定のネットワークにいなければならないようにします。または両方。アプリでIdentityServerを設定するか、個別に設定することができます。 – juunas
@juunasゲストユーザ(B2C環境)に対してもオープンでなければならないため、認証/認可は本当に使用できません。 API呼び出しが別のサーバ/ mvcコントローラから行われた場合、IPアドレスで制限することは可能でした。ただし、リクエストはJSからXhr/Ajaxを介して直接送られます。 –
何らかの認証を追加します –