我正在尝试将IdentityServer4设置为使用我自己的(mongodb)数据库,而不是文档中显示的内存示例。
为此,我配置了以下服务:
builder.Services.AddTransient<IPersistedGrantStore, PersistedGrantStore>();
builder.Services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>();
builder.Services.AddTransient<IClientStore, ClientStore>();
builder.Services.AddTransient<IResourceStore, ResourceStore>();
在我的数据库中,我创建了4个集合:“ApiResources”,“IdentityResources”和“Clients”。
在ApiResources中,我已经定义了我应该保护的API:
{
"Name" : "MyAPI",
"DisplayName" : "Test API Resource"
}
在IdentityResources中,我已经定义了应该是我的身份:
{
"Name" : "MyIdentity",
"DisplayName" : "Test Identity Resource"
}
我已经定义了以下客户端:
{
"ClientId" : "client",
"Enabled" : true,
"ClientSecrets" : [
{
"Description" : null,
"Value" : "K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=",
"Expiration" : null,
"Type" : "SharedSecret"
}
],
"ClientName" : null,
"ClientUri" : null,
"LogoUri" : null,
"RequireConsent" : true,
"AllowRememberConsent" : true,
"AllowedGrantTypes" : [
"client_credentials"
],
"AllowedScopes" : [
"MyAPI"
],
"Claims" : [
],
"AllowedCorsOrigins" : [
]
}
我的数据库表示类似于文档中的示例所表示的内容。
在我的IResourceStore
实现中,对于FindIdentityResourcesByScopeAsync
,我在IdentityResources
集合中查找范围名称(如方法名称所示)和FindApiResourcesByScopeAsync
我查找我的ApiResources
集合中的范围,顾名思义。
当我尝试针对服务器验证客户端时,我收到Requested scope not allowed: MyAPI
。
但如果我将FindIdentityResourcesByScopeAsync
中的代码更改为ApiResources
,那么它就能正常工作。
这是一个错误吗?或者我不确切地知道IdentityResources和ApiResources之间的区别是什么?什么时候应该使用?如果在FindIdentityResourcesByScopeAsync
我应该使用我的API资源,我应该在FindApiResourcesByScopeAsync
中采取什么?
答案 0 :(得分:1)
所以我终于弄明白了问题所在。虽然在询问FindIdentityResourcesByScopeAsync
时返回API资源 - 这显然不是可行的方法。
我终于注意到问题实际上在ApiResource
返回的FindApiResourcesByScopeAsync
对象中。当它返回一个ApiResource
,其中包含我要授予访问权限的API的名称时,该对象不包含Scopes
的任何值,该值还应包含MyAPI
的记录
这里我不明白的是这个Scopes
对象是什么。为什么它应该再次包含MyAPI
定义(就像父对象一样)。我应该/可以在这里添加其他Scopes
以及它们的含义是什么?