IdentityServer4 ResourceStore - IdentityResource与ApiResource

时间:2017-05-22 15:31:41

标签: identityserver4

我正在尝试将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中采取什么?

1 个答案:

答案 0 :(得分:1)

所以我终于弄明白了问题所在。虽然在询问FindIdentityResourcesByScopeAsync时返回API资源 - 这显然不是可行的方法。

我终于注意到问题实际上在ApiResource返回的FindApiResourcesByScopeAsync对象中。当它返回一个ApiResource,其中包含我要授予访问权限的API的名称时,该对象不包含Scopes的任何值,该值还应包含MyAPI的记录

这里我不明白的是这个Scopes对象是什么。为什么它应该再次包含MyAPI定义(就像父对象一样)。我应该/可以在这里添加其他Scopes以及它们的含义是什么?