如何处理多个授权服务器以防止令牌颁发失败

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 值不在实例之间共享。