2017-09-19 26 views
5

ile ben kullanıcı yetki JWT belirteçleri kullanan bir .Net Çekirdek 2.0 uygulama var. Tüm bunlar iyi çalışıyor ancak diğer uygulamaların tümleştirilmesine izin vermek için bir çeşit API Anahtarı mekanizmasına sahip olmak istiyorum ancak geçerli kimlik doğrulamasıyla çalışmasını sağlayamıyorum. Kod.Net Çekirdek JWT Doğrulama özel API Anahtarı Middleware

: Yani kodda ben bir başlık olarak adlandırılan ApiKey sağlamak ve daha sonra bunu doğrulamak HTTP isteklerine müdahale ettiğimi görebilirsiniz yukarıdaki

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

ne saklandı Bu bölüm tüm eserler ancak bu işe yaramazsa bağlıyor ve aşağıdaki hata günlükleri almak Authorize bir API Yöntem çağrılırken:

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 

Şimdi bu isteğin yalnızca bir ApiKey başlık tedarik ile ilgisi olduğunu tahmin ediyorum ve doğru bir JWT jetonu olan bir Authorization başlığı değil.

nasıl sadece bir ApiKey başlığını tedarik edebiliyoruz duyuyorum ve olduğunda hiçbir ApiKey başlığı sonra JWT belirteci gerektiren son çare?

+0

Eğer Asp.net Kimlik kullanıyor musunuz? –

+0

@AramKocharyan Evet –

+0

'Roles' özelliği ile' Authorize' özniteliğini kullanıyor musunuz? GenericPrincipal' istemler ile ilgisi var 'çünkü' İddia ("rol", "Yönetici") 'uygulanıyor' [Yetkilendirme (Roller = “foo”)] ' –

cevap

3

Claim("role", "Admin")'un GenericPrincipal'a uygulanması, hiçbir şeyi etkilemez, çünkü GenericPrincipal, Rol İstemleri ile ilgisi yoktur. Eğer GenericPrincipal yönetici rol uygulamak istiyorsanız Yani, yapıcı parametresinde eklemek gerekir:

var principal = new GenericPrincipal(identity, new[] {"Admin","ApiUser"}); 
context.User = principal; 
İlgili konular