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?
Eğer Asp.net Kimlik kullanıyor musunuz? –
@AramKocharyan Evet –
'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”)] ' –