对于使用混合授权类型的客户端,IdentityServer4 的有效 grant_type 值是多少?

What are the valid grant_type values for IdentityServer4 with a Client using Hybrid grant type?

我使用的是 IdentityServer4 包的版本 1.0.0。

"IdentityServer4": "1.0.0"

我创建了一个客户端

new Client
{
    ClientId = "MobleAPP",
    ClientName = "Moble App",
    ClientUri= "http://localhost:52997/api/",                    
    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

    ClientSecrets =
    {
        new Secret("SecretForMobleAPP".Sha256())
    },

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        "api"
    },
    AllowOfflineAccess = true
}

还有 scope/ApiResources

public static IEnumerable<ApiResource> GetApiResources()
{
   return new List<ApiResource>
   {

      new ApiResource("api", "My API")

    };
}

与以下user/TestUser

public static List<TestUser> GetUsers()
{
        return new List<TestUser>
        {

            new TestUser
            {
                SubjectId = "2",
                Username = "bob",
                Password = "password",

                Claims = new []
                {
                    new Claim(JwtClaimTypes.Name, "Bob Smith")
                }
            }
        };
}

我正在尝试测试我从 Postman 设置的 IdentityServer 并确定 grant_type 键值对的可能值。

当我将 grant_type 设置为 client_credentials 时我可以成功连接并且不确定 grant_type 值是否有其他选项。

Working Postman configuration with grant_type set to client_credentials

简答

client_credentials 是唯一的 grant_type 值,您可以在同时使用混合和客户端凭据授权类型时 直接针对令牌端点 使用。


更长的答案

客户端凭据授权类型是唯一允许您直接访问令牌端点的类型,这就是您在 Postman 示例中所做的。在那种情况下,身份验证是针对客户端本身完成的 - 即您注册的应用程序。

当您使用混合授权类型时,将针对 end-user - 使用您的应用程序的用户进行身份验证。在这种情况下,您不能直接点击端点令牌,但必须向 IdentityServer 发出 authorization request

这样做时,您不会使用 grant_type 参数,而是使用 response_type 参数来指示 IdentityServer 您期望返回的内容。 当您使用混合授权类型时 response_type 的可能值可以在 in IdentityServer constants 中找到 - 它们是字典中的最后 3 项:

  • code id_token,这将return一个授权码和一个身份令牌
  • code token、return获取授权码和访问令牌
  • code id_token token,给你一个授权码,一个身份令牌和一个访问令牌

获得授权码后,您将能够通过访问令牌端点将其交换为访问令牌,并可能是刷新令牌。