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 错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenIdDict 多个授权服务器无法解码相同的访问令牌

获取计数行的最后一个实例

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名

OpenIddict:如何在资源服务器中注册签名密钥以验证令牌?

ASP.NET 4.5 或替代框架中的 OpenIdDict?

将服务结构应用程序部署到公共服务结构集群后出现“分区低于目标副本或实例计数”错误