密钥环中未找到密钥。无法验证令牌。

9

在我的应用程序前面添加NGNIX代理后,我在身份服务器4上遇到了奇怪的错误。

  1. 我的.Net Core身份服务器在Docker容器上运行,端口为8080。

  2. Ngnix代理(使用https://github.com/nginx-proxy/nginx-proxy)已配置将443路由到Docker容器8080。

在成功验证回调端点后,它无法验证伪造令牌。

奇怪的是,整个情景对于我启动.Net Core应用程序时种子用户有效,但对于通过我的API创建的新用户无效。

任何想法或建议都将不胜感激。


请增加问题的清晰度,例如指定引发错误或意外结果的代码行数等更多信息。 - Willy satrio nugroho
请改进问题并指定您在哪个URL /页面上遇到了该错误。发布失败的URL副本也会有所帮助。 - Tore Nestenius
请参阅以下链接中的答案:https://dev59.com/tlcP5IYBdhLWcg3wTIQt - Michael Freidgeim
4个回答

14

由ASP.NET Core发行的会话cookie使用数据保护API进行加密。

用于签署 cookie 的密钥存储在密钥环中。如果您重新部署应用程序而未正确配置它,则将在新的密钥环中发布新的加密密钥。

如果无法找到用于加密 cookie 的密钥,则表示所有客户端浏览器中的现有会话 cookie 无法再进行解密。

请参阅此文章了解有关此API的信息,以及此文章了解如何配置它。

IdentityServer和Client应用程序都使用数据保护API,因此两者都需要具有永久的密钥环。当您重新部署容器时,密钥环会丢失,除非您已将密钥环放置在文件系统上的某个永久卷中或以其他方式持久化。API支持许多存储密钥环的位置,包括数据库、redis、Azure Key Vault等。


考虑到这一点,我也尝试将密钥存储在文件系统中。 - Hafiz Mohammed
我更新了我的回答,这有帮助吗?还是这不是你的问题? - Tore Nestenius
1
我已经解决了问题,问题出在nginx代理缓冲区上。通过(https://medium.com/@mshanak/solve-nginx-error-signin-oidc-502-bad-gateway-dotnet-core-and-identity-serve-bc27920b42d5)进行了修复。 - Hafiz Mohammed
太棒了!你知道核心问题是什么吗?是你的会话 cookie 太大了吗? - Tore Nestenius
我的客户端请求头超过了1K字节。 - Hafiz Mohammed
@ToreNestenius,你是不是忘了在SO上只有链接的答案是不合适的,或者你根本不在乎实际上总结链接中的内容需要付出的努力,以防它们随着时间的推移发生变化或无法访问? - psiodrake

1

我在我的演示环境(生产和本地都可以)遇到了这个问题,Tore Nestenius的答案帮助我解决了它。

实际上,我重新安装了所有的演示环境。因此,密钥库是新的,但运行网站的浏览器却使用旧的cookie。这导致了以下错误:

System.Security.Cryptography.CryptographicException:密钥未在密钥环中找到。

只需清除您的cookie!

这将从新的存储中更新密钥。


0
我们只为内部使用构建内部Web应用程序。关闭此功能,或者更好的是,默认情况下不启用它会更好。将其包含在我们的应用程序中是过度工程化的。我尝试使用"builder.Services.AddDataProtection().DisableAutomaticKeyGeneration();"但并不成功。我需要进一步研究他们的代码,看看如何永久关闭我们内部应用程序的此功能。

2
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自评论 - undefined

-1
有时候当我们在IIS中发布项目,并且使用Entity Framework Core以及连接字符串中的Windows身份验证,而设置不正确时,就会出现这个问题,你可能会遇到相同的错误。所以如果将其更改为SQL身份验证,你的问题可能会得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接