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

问题描述 投票:0回答:1

设置:我有两台服务器,它们都有 .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-core identityserver4
1个回答
0
投票

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

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

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

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

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

我最近在这里发表了有关状态和随机数参数的博客:

© www.soinside.com 2019 - 2024. All rights reserved.