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

Asp.net core 如何处理多个授权服务器以防止令牌颁发失败,asp.net-core,identityserver4,Asp.net Core,Identityserver4,设置:我有两台服务器,它们都有我的.NET核心OpenId授权应用程序的一个IIS实例 存在一个间歇性问题,即如果用户的请求在服务器1上启动,在请求期间的某个时间点,用户的请求被转移到服务器2,则授权失败,并显示以下消息: Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token ... fail: IdentityServer4.Valid

设置:我有两台服务器,它们都有我的.NET核心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实例?无论如何,您还应该提供一个正确的令牌签名密钥,并且不要在启动类中使用AddDeveloperSigningCredential方法

当用户被要求登录时,实例(带有AddOpenIDConnect)应与处理IdentityServer回调(对/signin oidc的请求)的实例相同


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

我目前使用的是RsaKeyService,而不是AddDeveloperSigningCredential,其中两个实例具有唯一的rsakey.json文件。为了测试,我确实使这两个rsakey.json文件相同,但相同的问题仍然存在。我确实有多个IdentityServer实例,每台服务器一个,但除了rsakey.json文件外,这两个实例都是完全相同的应用程序文件。在这种情况下,您认为我仍然需要配置共享数据保护密钥吗?我也会为此做一些研究,谢谢!如果希望用户在机器之间无缝移动,则令牌签名密钥和数据保护密钥在所有实例中都应相同。我在这里写了关于数据保护api的博客,但正如我所说的,(AddOpenIDConnect…)处理程序的实例也应该与处理整个“签名流”的实例相同。否则您将拥有state/PKCE。。。问题。如果回答了您的问题,请随意接受我的答案。不幸的是,这似乎没有解决我的问题-我已设置以下内容:字符串sKeysPath=Path.Combine(Path.GetDirectoryName(Assembly.getexecutinggassembly().Location),“Keys”);services.AddDataProtection().SetApplicationName(“我的应用程序”).PersistKeySystem(新目录信息(skeyPath));将自动生成的密钥从一台服务器放置到另一台服务器上,但问题仍然存在。只是澄清一下,AddOpenIDConnect来自客户端的应用程序。