我正在尝试确定ApiResource和Client如何捆绑在一起。
如何确保从客户端请求令牌的人请求特定的ApiResource访问该ApiResource?
是否被范围捆绑在一起?
以下是QuickStart中稍微修改过的代码:
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api1Resource", "My API")
{
Scopes =
{
new Scope("api1"),
new Scope("api1.ro"),
new Scope("offline_access")
},
UserClaims = { "role", "user" }
}
};
}
// client want to access resources (aka scopes)
public static IEnumerable<Client> GetClients()
{
// client credentials client, for APIs
return new List<Client>
{
new Client
{
ClientId = "apiClient",
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets =
{
// Secret that can be created and given to ITSM_API
new Secret("secret".Sha512(), "ITSM_API Secret")
},
AllowedScopes = { "api1", "api1.ro", "offline_access" }
},
// resource owner password grant client, for interactive users
new Client
{
ClientId = "userClient",
AllowedGrantTypes = GrantTypes.List
(
GrantType.ResourceOwnerPassword,
"offline_access"
),
ClientSecrets =
{
new Secret("secret".Sha512(), "userClient Secret")
},
UpdateAccessTokenClaimsOnRefresh = true,
AllowedScopes = { "api1", "api1.ro", "offline_access" },
AbsoluteRefreshTokenLifetime = 86400,
AllowOfflineAccess = true,
RefreshTokenUsage = TokenUsage.ReUse
}
};
}
答案 0 :(得分:1)
阅读本文可能会有所帮助...... https://leastprivilege.com/2016/12/01/new-in-identityserver4-resource-based-configuration/。在此之前,没有资源,只有范围。范围的抽象性意味着事情并不总是显而易见的,因此发明了资源。
因此,您当前正在指定Client > AllowedScopes
的位置,您可以引用您的资源,而不是重复您在资源中定义的范围。 https://identityserver4.readthedocs.io/en/release/reference/api_resource.html
答案 1 :(得分:0)
范围是您为资源服务器提供的资源。例如,如果您有一个日历资源服务器,那么您的范围将是calendarentry
,read.calendarentry
,create.calendarentry
。所以基本上是用户可以在您的服务器上执行的操作。
API资源是您的资源服务器整体。客户端(获取access_token的客户端)请求其所需的范围,用户将权限授予客户端。
将范围放入access_token,当资源服务器收到access_token时,您需要检查是否允许用户(由access_token标识)访问请求的范围。 (这可以事先在IdentityServer上完成)。例如,如果用户有权访问您定义的API资源,则可以在登录时检查您的用户数据库。 IdentityServer非常易于配置,几乎适合所有设置。