作为迁移项目的一部分,我正尝试使用.Net Core / ApiServer替换基于遗留的基于自定义构建jwt的身份验证api。理想情况下,我们的新解决方案产生的jwt令牌应该与旧版产生的jwt令牌非常匹配;包括范围的使用。例如旧版:
{
"iss": "http://example.com",
"sub": "api@example",
"unique_name": "test@api",
"given_name": "api user",
"scope": [
"GET api/balance/{date}",
"GET api/whoami",
...
],
"role": "12,0,11",
"client-scope": "test_client",
"user-scope": [
"Support",...
],
"aud": "test_client",
"exp": 1543376516,
"nbf": 1543376216
}
我们的新解决方案几乎可以正常工作-范围(API动词和端点)除外。我用来设置这些的方法是:
首先在startup.cs中添加支持:
IdentityServerBuilderExtensionsCrypto
.AddSigningCredential(services.AddIdentityServer(options =>
{
options.IssuerUri = Configuration["Jwt:Issuer"];
}), signingKey)
.AddInMemoryApiResources(InMemoryConfiguration.ApiResources().Result)
.AddInMemoryClients(InMemoryConfiguration.Clients().Result);
将ApiRepources数组设置为URL端点列表
var resources = new List<ApiResource> {
new ApiResource("api/balance/{date}"), new ApiResource("api/whoami"), ...
};
将这些设置为客户端范围
AllowedScopes = ["api/balance/{date}", "api/whoami", ...etc]
提交请求时,我收到invalid_scope错误,并在日志中报告以下内容:
2018-12-02 08:37:24.8874 IdentityServer4.Validation.ScopeValidator不允许请求的范围:api / holdings / {date}
似乎GET动词已被截断以进行检查?我已经能够获得删除GET(或其他动词)前缀的基本示例,但是不幸的是,我们可能仍需要使用它来支持现有的应用程序。
有人能够帮助建议我们如何使它工作吗?