2017-09-19 36 views
5

私は、JWTトークンを使用してユーザーを認証する.Net Core 2.0アプリケーションを持っています。 これはすべて正常に動作しますが、他のアプリケーションを統合するためのAPIキーメカニズムが必要ですが、現在の認証では動作しないようです。.Net CoreカスタムAPIキーミドルウェアでのJWT認証

コード:

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, 
      IMemoryCache cache, IServiceProvider serviceProvider) 
{ 
    app.UseAuthentication(); 

    ApiKeyMiddlewear(app, serviceProvider); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 

      routes.MapSpaFallbackRoute(
       name: "spa-fallback", 
       defaults: new { controller = "Home", action = "Index" }); 
     }); 
    } 
} 


    private static void ApiKeyMiddlewear(IApplicationBuilder app, IServiceProvider serviceProvider) 
    { 
     app.Use(async (context, next) => 
     { 
      if (context.Request.Path.StartsWithSegments(new PathString("/api"))) 
      { 
       // Let's check if this is an API Call 
       if (context.Request.Headers["ApiKey"].Any()) 
       { 
        // validate the supplied API key 
        // Validate it 
        var headerKey = context.Request.Headers["ApiKey"].FirstOrDefault(); 
        var settingsProvider = serviceProvider.GetService<ISettingsService<OmbiSettings>>(); 
        var ombiSettings = settingsProvider.GetSettings(); 
        var valid = ombiSettings.ApiKey.Equals(headerKey, StringComparison.CurrentCultureIgnoreCase); 
        if (!valid) 
        { 
         context.Response.StatusCode = (int) HttpStatusCode.Unauthorized; 
         await context.Response.WriteAsync("Invalid API Key"); 
        } 
        else 
        { 
         var identity = new GenericIdentity("API"); 
         identity.AddClaim(new System.Security.Claims.Claim("Origin", "Api")); 
         identity.AddClaim(new System.Security.Claims.Claim("role", "Admin")); 

         var principal = new GenericPrincipal(identity, new[] {"ApiUser"}); 
         context.User = principal; 
         await next(); 
        } 
       } 
       else 
       { 
        await next(); 
       } 
      } 
      else 
      { 
       await next(); 
      } 
     }); 
    } 
} 

だから、上記のコードでは、私はAPIKEYというヘッダーを提供し、HTTP要求を傍受していていることがわかりますし、次に何私にそれを検証します保存されています。この部分は、すべての作品が、これは動作しません属性と私は、次のエラーログを取得AuthorizeとAPIのメソッドを呼び出すとき:

2017-09-19 08:15:17.280 +01:00 [Information] Request starting HTTP/1.1 POST http://localhost:52038/api/v1/Identity/ application/json 372 
2017-09-19 08:15:21.967 +01:00 [Information] Authorization failed for user: "API". 
2017-09-19 08:15:21.976 +01:00 [Information] Authorization failed for the request at filter '"Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter"'. 
2017-09-19 08:15:21.981 +01:00 [Information] Executing ForbidResult with authentication schemes ([]). 
2017-09-19 08:15:21.991 +01:00 [Information] AuthenticationScheme: "Bearer" was forbidden. 
2017-09-19 08:15:21.996 +01:00 [Information] Executed action "Ombi.Controllers.IdentityController.CreateUser (Ombi)" in 38.8268ms 
2017-09-19 08:15:22.004 +01:00 [Information] Request finished in 4723.032ms 403 

は、今私は、これは、要求だけApiKeyヘッダを供給しながら行うことです推測しているが正しいJWTトークンを持つAuthorizationヘッダーではありません。

どのようにしてApiKeyヘッダーのみを供給でき、ApiKeyヘッダーがないときにJWTトークンを要求するようにフォールバックすることができますか?

+0

Asp.net IDを使用していますか? –

+0

@AramKocharyanはい –

+0

'Roles'プロパティで' Authorize'属性を使用していますか? 'GenericPrincipal'はクレームとは関係がないため、' [Authorize(Roles = "foo")] ' –

答えて

3

Claim("role", "Admin")GenericPrincipalを適用すると、影響を受けません。なぜならGenericPrincipalは役割の要求とは関係がないからです。したがって、GenericPrincipalに管理者ロールを適用する場合は、コンストラクタパラメータに追加する必要があります。

var principal = new GenericPrincipal(identity, new[] {"Admin","ApiUser"}); 
context.User = principal; 
関連する問題