"Unexpected code_verifier" 尝试使用 IdentityServer4 在混合流程(使用 PKCE)中获得授权时
"Unexpected code_verifier" when trying to achieve authorization in hybrid flow (with PKCE) using IdentityServer4
我正在尝试实现本机客户端(首先将 .NET 控制台应用程序作为模型)以使用 OpenID Connect 对 IdentityServer4 作为我的 STS 进行身份验证。我使用 IdentityModel.OidcClient2 作为我的客户端库。
我选择实施基于代码的身份验证流程。
我能够通过身份验证阶段,但是当我进入授权阶段时,我在客户端收到一条错误消息
invalid_grant
在 IdentityServer 中,错误消息是
"Unexpected code_verifier: XXXXXXXXXXX...."
即使当我打开 fiddler 并查看请求和调试信息时 - 发送到 IdentityServer 以进行授权的代码验证程序似乎最初是在 AuthorizationState
中生成的客户端class.
如果我用 AuthorizationState.CodeVerifier = null
执行,那么它就可以工作。
但我确实想实施 PKCE 以提高安全性。我怎样才能做到这一点?
这是该特定客户端的配置
身份服务器:
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"
};
您需要在 IdentityServer 的客户端配置中将 RequirePkce
设置为 true。
我正在尝试实现本机客户端(首先将 .NET 控制台应用程序作为模型)以使用 OpenID Connect 对 IdentityServer4 作为我的 STS 进行身份验证。我使用 IdentityModel.OidcClient2 作为我的客户端库。
我选择实施基于代码的身份验证流程。
我能够通过身份验证阶段,但是当我进入授权阶段时,我在客户端收到一条错误消息
invalid_grant
在 IdentityServer 中,错误消息是
"Unexpected code_verifier: XXXXXXXXXXX...."
即使当我打开 fiddler 并查看请求和调试信息时 - 发送到 IdentityServer 以进行授权的代码验证程序似乎最初是在 AuthorizationState
中生成的客户端class.
如果我用 AuthorizationState.CodeVerifier = null
执行,那么它就可以工作。
但我确实想实施 PKCE 以提高安全性。我怎样才能做到这一点?
这是该特定客户端的配置
身份服务器:
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"
};
您需要在 IdentityServer 的客户端配置中将 RequirePkce
设置为 true。