asp.net-core - 如何处理多个授权服务器以防止令牌颁发失败
问题描述
设置:我有两台服务器,它们都有一个单独的 .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 实例吗?无论您还应该提供正确的令牌签名密钥,而不是在您的启动类中使用AddDeveloperSigningCredential方法。
当要求用户登录时,该实例(使用 AddOpenIDConnect)应该与处理来自 IdentityServer 的回调(对 /signin-oidc 的请求)的实例相同。
例如,状态参数和PKCE值不会在实例之间共享。
推荐阅读
- mfc - MFC获取鼠标指针坐标问题
- localhost - 如何从另一台计算机连接到 localhost:5555?
- c++ - 如何将main Dlg的指针从线程传递到MFC内部的函数
- typescript - aws-cdk 忽略 tsconfig 路径和类型根
- c - c - 无法使用 scanf() 获取多个字符串
- python - 使用 HttpCommunicator 进行 Django 频道测试
- javascript - 如何根据表单提交使用 jQuery 更改 CSS 样式?
- python - 使用 yahoo Finance 在 python 中测试股息率
- javascript - discord.js 分片就绪超时 V12
- python - Quantlib:Vol 表面,不同期限的不同罢工水平