.Net Core Web Api Key
Я разрабатываю приложение, которое пользователи могут аутентифицировать с помощью имени пользователя и пароля, и мы предоставляем токен JWT, который затем проверяется на сервере.
Одна вещь, которую я хотел бы добавить, - это возможность иметь специальный ключ API (guid), который пользователи могут использовать при интеграции с этим приложением вместо использования имени пользователя и пароля.
Я не уверен, как это сделать, поскольку часть проверки подлинности выглядит как черный ящик (с использованием Aspnet Identity).
Вот мой код для настройки аутентификации.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<OmbiContext>(options =>
options.UseSqlite("Data Source=Ombi.db"));
services.AddIdentity<OmbiUser, IdentityRole>()
.AddEntityFrameworkStores<OmbiContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 1;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache cache)
{
var tokenOptions = (IOptions<TokenAuthentication>)app.ApplicationServices.GetService(
typeof(IOptions<TokenAuthentication>));
var ctx = (IOmbiContext)app.ApplicationServices.GetService(typeof(IOmbiContext));
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.Value.SecretKey)),
RequireExpirationTime = true,
ValidateLifetime = true,
ValidAudience = "Ombi",
ValidIssuer = "Ombi",
ClockSkew = TimeSpan.Zero
};
app.UseJwtBearerAuthentication(new JwtBearerOptions()
{
Audience = "Ombi",
AutomaticAuthenticate = true,
TokenValidationParameters = tokenValidationParameters,
});
//....
}
Приведенный выше код работает при наличии атрибутов [Authorized]
на контроллерах и проверке ролей и тому подобного.
У кого-нибудь есть идеи, как передать какой-либо заголовок Api-Key
на все запросы, содержащие этот специальный ключ API, чтобы он передавал атрибуты [Authorized]
? (ключ хранится в БД).
Спасибо
Ответы
Ответ 1
Это то, что я сделал в конце:
public static void ApiKeyMiddlewear(this IApplicationBuilder app, IServiceProvider serviceProvider)
{
app.Use(async (context, next) =>
{
if (context.Request.Path.StartsWithSegments(new PathString("/api")))
{
// Let 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();
await ValidateApiKey(serviceProvider, context, next, headerKey);
}
else if (context.Request.Query.ContainsKey("apikey"))
{
if (context.Request.Query.TryGetValue("apikey", out var queryKey))
{
await ValidateApiKey(serviceProvider, context, next, queryKey);
}
}
else
{
await next();
}
}
else
{
await next();
}
});
}
private static async Task ValidateApiKey(IServiceProvider serviceProvider, HttpContext context, Func<Task> next, string key)
{
// validate it here
var valid = false;
if (!valid)
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
await context.Response.WriteAsync("Invalid API Key");
}
else
{
var identity = new GenericIdentity("API");
var principal = new GenericPrincipal(identity, new[] { "Admin", "ApiUser" });
context.User = principal;
await next();
}
}
Это немного изменилось с тех пор, как я ответил на первоначальный вопрос (ответ по-прежнему действителен). Но вы можете прочитать об этом здесь: http://jamietech.com/2019/03/25/net-core-jwt-api-key/
Ответ 2
Существует хорошая статья об использовании ключей api в запросах заголовков по этой ссылке: http://www.mithunvp.com/write-custom-asp-net-core-middleware-web-api/
Подводя итог, в ASP.NET Core вы можете использовать Middleware для управления конфигурацией конвейера http. Middleware эффективно заменяет HttpHandlers, которые использовались в версиях asp.net MVC в версиях alal.
Ответ 3
По этой ссылке есть хорошая статья об использовании ключей API в запросах заголовков: http://www.mithunvp.com/write-custom-asp-net-core-middleware-web-api/
Подводя итог, можно сказать, что в ASP.NET Core вы можете использовать Middleware для управления конфигурацией конвейера http. Промежуточное программное обеспечение эффективно заменяет HttpHandlers, которые использовались в более ранних версиях asp.net MVC.