【发布时间】:2018-01-29 14:24:25
【问题描述】:
我正在开发一个应用程序,用户可以通过用户名和密码进行身份验证,我们提供了一个 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 密钥的所有请求上传递某种 Api-Key 标头以传递 [Authorized] 属性? (密钥存储在数据库中。)
【问题讨论】:
-
@stuartd 不确定上述是否适用,查看它我需要为每个控制器定义该策略,在这种情况下,API Key 标头将始终需要存在。基本上我正在寻找一种方法来向授权我的服务器提供秘密。
-
您在请求中提供带有授权标头的不记名令牌。并且根据授权服务器所在的位置,您需要对其进行验证。 IE。在 azure AD 中,如果您只想针对服务器中的硬编码密钥进行验证,您可以在 appregistration 下添加一个 api,您可以通过自己的声明验证器进行验证,检查 AuthorizationHandler 类
标签: c# asp.net-core asp.net-identity