尝试使用IdentityServer4在混合流(使用PKCE)中实现授权时出现“意外的code_verifier”

时间:2017-03-09 17:22:05

标签: asp.net-core identityserver4 openid-connect pkce

我正在尝试使用OpenID Connect对IdentityServer4作为我的STS来实现本机客户端(.NET控制台应用程序首先作为模型)进行身份验证。我使用IdentityModel.OidcClient2作为我的客户端库 我选择实现基于代码的身份验证流程。

我能够通过身份验证阶段,但是当我进入授权阶段时,我在客户端收到一条错误消息

  

invalid_grant

在IdentityServer上,错误消息为

  

“意外的code_verifier:XXXXXXXXXXX ....”


即使当我打开提琴手并查看请求和调试信息时 - 发送到IdentityServer进行授权的代码验证程序似乎是客户端首先在AuthorizationState类中生成的。登记/> 如果我使用AuthorizationState.CodeVerifier = null执行,那么它可以工作。
但我确实希望实施PKCE以增加安全性。我怎样才能做到这一点?

以下是该特定客户的配置
Identity Server:

            new Client
            {
                ClientId = "nativeapp1",
                ClientName = "Native App Demo - 1",
                AllowedGrantTypes = GrantTypes.Hybrid,

                RequireConsent = true,

                ClientSecrets =
                {
                    new Secret("some-secret1".Sha256())
                },

                AllowedScopes = {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.OfflineAccess,
                    "custom.name",
                    "api1"
                },

                RedirectUris = {"http://127.0.0.1:7890/"},
                //PostLogoutRedirectUris = {"" }
                AllowOfflineAccess = true
            }

和客户端配置

var options = new OidcClientOptions
        {
            Authority = _authority,
            ClientId = "nativeapp1",
            RedirectUri = redirectUri,
            Scope = "openid profile api1 custom.name offline_access",
            FilterClaims = true,
            LoadProfile = false,
            Flow = OidcClientOptions.AuthenticationFlow.Hybrid,
            ClientSecret = "some-secret1"
        };

1 个答案:

答案 0 :(得分:2)

您需要在IdentityServer中的客户端配置上将RequirePkce设置为true。