私は、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トークンを要求するようにフォールバックすることができますか?
Asp.net IDを使用していますか? –
@AramKocharyanはい –
'Roles'プロパティで' Authorize'属性を使用していますか? 'GenericPrincipal'はクレームとは関係がないため、' [Authorize(Roles = "foo")] ' –