OpenIddict:当两个或更多服务实例计数时出现 401 错误
Posted
技术标签:
【中文标题】OpenIddict:当两个或更多服务实例计数时出现 401 错误【英文标题】:OpenIddict: 401 errors when two or more service instance count 【发布时间】:2017-07-26 12:20:04 【问题描述】:我有一个带有 Angular2 UI 的 .NET Core 应用程序在我使用 OpenIddict 保护的 Service Fabric 集群中运行。我按照这个例子:https://github.com/openiddict/openiddict-samples/tree/master/samples/RefreshFlow
当我只有一个无状态 .NET Core 应用程序实例时,它的效果很好。当我将实例数增加到两个时,身份验证失败并且我收到一堆 401 错误。我收到的令牌似乎只对那个特定实例有用,而在另一个实例上被拒绝。 我想我理解为什么会发生这种情况,但我不知道如何解决它。
任何帮助将不胜感激。
【问题讨论】:
问题解决了吗?如何?我也有同样的问题。 抱歉还没有。我现在要重新审视这个问题,并将遵循下面列出的建议。 我添加了一个适合我的解决方案。 【参考方案1】:OpenIddict 依赖 ASP.NET Core Data Protection stack 来生成和保护其授权码、刷新令牌和访问令牌(除非您明确选择 JWT 作为访问令牌格式)。
为确保可以跨实例读取这些令牌,您必须将 ASP.NET Core 数据保护配置为共享同一个密钥环。如果您需要有关此过程的更多信息,我建议您阅读the related documentation on Microsoft's website。
【讨论】:
我认为这与任何需要解密单独实例上的数据的系统有关吗?另外,之前没听说过openiddict,现在用的是idsrv4,得看看。伟大的工作:) @Mardoxx 是的,它适用于使用 ASP.NET Core 数据保护的所有内容,包括身份验证 cookie 或您使用IDataProtector
加密的数据。
我将此标记为答案,因为它为我指明了正确的方向。我在下面添加了一些与 Service Fabric 集群相关的说明。【参考方案2】:
我通过查看以下内容解决了这个问题:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers#azure-and-redis
以下是我采取的基本步骤:
创建一个 blob 存储帐户来存储共享密钥。
将以下代码添加到您的 Startup.cs:
var storageAccount = CloudStorageAccount.Parse("blob storage connection string");
//Create the blob client object.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
//Get a reference to a container to use for the sample code, and create it if it does not exist.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
services.AddDataProtection()
.SetApplicationName("MyApplication")
.PersistKeysToAzureBlobStorage(container, "myblobname");
就是这样。
【讨论】:
以上是关于OpenIddict:当两个或更多服务实例计数时出现 401 错误的主要内容,如果未能解决你的问题,请参考以下文章
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名
OpenIddict:如何在资源服务器中注册签名密钥以验证令牌?