IdentityServer4 - ApiResource和Client,它们是如何捆绑在一起的

时间:2017-05-23 22:01:44

标签: c# asp.net-core identityserver4

我正在尝试确定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
        }
    };
}

2 个答案:

答案 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)

范围是您为资源服务器提供的资源。例如,如果您有一个日历资源服务器,那么您的范围将是calendarentryread.calendarentrycreate.calendarentry。所以基本上是用户可以在您的服务器上执行的操作。

API资源是您的资源服务器整体。客户端(获取access_token的客户端)请求其所需的范围,用户将权限授予客户端。

将范围放入access_token,当资源服务器收到access_token时,您需要检查是否允许用户(由access_token标识)访问请求的范围。 (这可以事先在IdentityServer上完成)。例如,如果用户有权访问您定义的API资源,则可以在登录时检查您的用户数据库。 IdentityServer非常易于配置,几乎适合所有设置。