如何处理多个授权服务器以防止令牌颁发失败
How to handle Multiple Authorization Servers to prevent Token Issued Failure
设置:我有两台服务器,它们都有我的 .NET Core OpenId 授权应用程序的单独 IIS 实例。
出现间歇性问题,如果用户的请求在服务器 1 上启动,在请求期间的某个时刻用户的请求被转移到服务器 2,然后授权失败并显示以下消息:
Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token
...
fail: IdentityServer4.Validation.TokenRequestValidator[0]
Invalid authorization code{ code = REDACTED }, details: {
...
"GrantType": "authorization_code",
"Error": "invalid_grant",
"Category": "Token",
"Name": "Token Issued Failure",
"EventType": "Failure",
似乎如果我的负载平衡器已将用户转移到对面的服务器,那么对 /connect/token 的请求总是失败并出现上述情况。但是,如果我要让我的一台服务器脱机并重新测试授权请求,那么它工作得很好。
如何让我的两个服务器都接受对 /connect/token 的请求,即使请求是在对方服务器上启动的?
使用负载均衡器时需要注意很多事项。
首先,您需要确保会话 cookie 在两台机器上都有效,并且您需要提供两个服务都使用的共享数据保护密钥。
你还有一个多IdentityServer实例吗?无论您还应该提供适当的令牌签名密钥,而不是在您的启动 class.
中使用 AddDeveloperSigningCredential 方法
当要求用户登录时,该实例(使用 AddOpenIDConnect)应与处理来自 IdentityServer 的回调(对 /signin-oidc 的请求)的实例相同。
例如 state 参数和 PKCE 值不在实例之间共享。
设置:我有两台服务器,它们都有我的 .NET Core OpenId 授权应用程序的单独 IIS 实例。
出现间歇性问题,如果用户的请求在服务器 1 上启动,在请求期间的某个时刻用户的请求被转移到服务器 2,然后授权失败并显示以下消息:
Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token
...
fail: IdentityServer4.Validation.TokenRequestValidator[0]
Invalid authorization code{ code = REDACTED }, details: {
...
"GrantType": "authorization_code",
"Error": "invalid_grant",
"Category": "Token",
"Name": "Token Issued Failure",
"EventType": "Failure",
似乎如果我的负载平衡器已将用户转移到对面的服务器,那么对 /connect/token 的请求总是失败并出现上述情况。但是,如果我要让我的一台服务器脱机并重新测试授权请求,那么它工作得很好。
如何让我的两个服务器都接受对 /connect/token 的请求,即使请求是在对方服务器上启动的?
使用负载均衡器时需要注意很多事项。
首先,您需要确保会话 cookie 在两台机器上都有效,并且您需要提供两个服务都使用的共享数据保护密钥。
你还有一个多IdentityServer实例吗?无论您还应该提供适当的令牌签名密钥,而不是在您的启动 class.
中使用 AddDeveloperSigningCredential 方法当要求用户登录时,该实例(使用 AddOpenIDConnect)应与处理来自 IdentityServer 的回调(对 /signin-oidc 的请求)的实例相同。
例如 state 参数和 PKCE 值不在实例之间共享。