2017-06-13 10 views
1

ゲストユーザーにも使用できるので、認証/承認のないいくつかのWeb APIエンドポイントがあります。これらのエンドポイントは、直接XHR/Ajax/JSを介して消費されます。しかし、私はわずかな起源からの要求を許可したいと思います。このために、私は以下のようにCorsミドルウェアを使用しました:オープン/パブリックWeb APIエンドポイントを保護する方法

ConfigureServices方法

services.AddCors(options => 
{ 
    options.AddPolicy("AllowSpecific", builder => 
     builder.WithOrigins("http://localhost:55476") 
      .AllowAnyHeader() 
      .AllowAnyMethod()); 
}); 

設定方法

app.UseCors("AllowSpecific"); 

をこの制限は、ブラウザからの要求のために動作します。しかし、要求がHTTPクライアント(例えば、Postman,Fiddlerなど)から来ている場合は、リクエストが通過します。

このようなシナリオに取り組む方法はありますか?

+0

認証またはネットワーク分離。発信者が知っているだけのものを知っている必要があるようにするか、電話をかけるために物理的に特定のネットワークにいなければならないようにします。または両方。アプリでIdentityServerを設定するか、個別に設定することができます。 – juunas

+1

@juunasゲストユーザ(B2C環境)に対してもオープンでなければならないため、認証/認可は本当に使用できません。 API呼び出しが別のサーバ/ mvcコントローラから行われた場合、IPアドレスで制限することは可能でした。ただし、リクエストはJSからXhr/Ajaxを介して直接送られます。 –

+0

何らかの認証を追加します –

答えて

1

私は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からの要求を許可するために、のエントリがあります。サーバに配備すると削除されます。

私は、この解決法を一方的にまたは別の方法でバイパスすることもできると考えています。しかし、私はそれがほとんどの場合にうまくいくと思っています。

関連する問題