[英].NET Core Web API key
我正在開發一個用戶可以通過用戶名和密碼進行身份驗證的應用程序,我們提供一個 JWT 令牌,然后在服務器上進行驗證。
我想補充的一件事是能夠擁有一個特殊的 API 密鑰 (guid),用戶在與此應用程序集成時可以使用它,而不是使用用戶名和密碼。
我不確定如何執行此操作,因為身份驗證部分似乎有點像一個黑匣子(使用 Aspnet Identity)。
這是我用於身份驗證設置的一些代碼。
啟動文件
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 密鑰的所有請求上傳遞某種Api-Key
標頭,以便它傳遞[Authorized]
屬性? (密鑰存儲在數據庫中。)
這就是我最后所做的:
public static void ApiKeyMiddlewear(this 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();
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/
在此鏈接上有一篇關於在標頭請求中使用 api 密鑰的好文章: http : //www.mithunvp.com/write-custom-asp-net-core-middleware-web-api/
總而言之,在 ASP.NET Core 中,您可以使用中間件來控制 http 管道配置。 中間件有效地替代了 HttpHandlers,后者用於較早版本的 asp.net MVC。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.