我想构建一个JWT安全令牌服务(.net core 2+),以便在不使用IdentityServer或OAuth的情况下为许多API(.net core 2+)提供身份验证和授权,因为我不需要重定向。
下图描述了该场景:
“JWT Authenticator”工作正常并且有路线
但是,我很难提供步骤4和5.我在API1 / Startup.cs - > ConfigureServices上尝试了很多选项,但在调用GET API1 / Resource时无法获得任何结果,而是404。 ConfigureServices方法仍然是这样的:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = "http://localhost:6000"; // JWT Authenticator address
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = _configuration.GetValue<string>("JwtIssuer"),
ValidAudience = _configuration.GetValue<string>("JwtAudience"),
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_configuration.GetValue<string>("JwtSecretKey"))),
ClockSkew = TimeSpan.Zero
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
是否可以使用AddJwtBearer等方法配置步骤4和5?如果没有,我该怎么办?使用API1的授权过滤器拦截请求并向JWT Authenticator发出请求以验证令牌/获取声明/等?
一些想法......
你的4和5路;通常你不会询问令牌的提供者是否有效。您所做的就是验证这一点,最有可能是签名,可以选择从提供商处下载哪些参数。
请注意细微差别:提供商本身不会检查它。
下一篇:ClockSkew = TimeSpan.Zero
,这很少。我至少会给它一些松懈。
至少;有一个404
表示找不到资源。它不是401
或403
。这表明授权是成功的,但找不到请求的资源。
签名验证的典型实现:
请注意,这并不能解决您的问题。
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
{
// get from provider
// todo: cache this
var json = new WebClient().DownloadString(
issuer + "/.well-known/jwks.json"); //typical endpoint
// serialize the result
var keys = JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
// cast the result to be the type expected by IssuerSigningKeyResolver
return (IEnumerable<SecurityKey>) keys;
}
//...