首页 > 解决方案 > 如何处理多个授权服务器以防止令牌颁发失败

问题描述

设置:我有两台服务器,它们都有一个单独的 .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 的请求?

标签: asp.net-coreidentityserver4

解决方案


使用负载平衡器时,您需要跟踪很多事情。

首先,您需要确保会话 cookie 在两台机器上都有效,并且您需要提供两个服务都使用的共享数据保护密钥。

您还有多个 IdentityServer 实例吗?无论您还应该提供正确的令牌签名密钥,而不是在您的启动类中使用AddDeveloperSigningCredential方法。

当要求用户登录时,该实例(使用 AddOpenIDConnect)应该与处理来自 IdentityServer 的回调(对 /signin-oidc 的请求)的实例相同。

例如,状态参数和PKCE值不会在实例之间共享。


推荐阅读