OpenIddict: ошибка 401 при подсчете двух или более экземпляров службы

У меня есть приложение .NET Core с пользовательским интерфейсом Angular2, работающее в кластере Service Fabric, которое я защитил с помощью OpenIddict. Я следовал этому примеру: https://github.com/openiddict/openiddict-samples/tree/master/samples/RefreshFlow

Это прекрасно работает, когда у меня есть только один экземпляр приложения .NET Core без сохранения состояния. Когда я увеличиваю количество экземпляров до двух, аутентификация завершается ошибкой, и я получаю кучу ошибок 401. Кажется, что токен, который я получаю, подходит только для этого конкретного экземпляра и отклоняется в другом экземпляре. Кажется, я понимаю, почему это происходит, но не знаю, как с этим бороться.

Любая помощь будет принята с благодарностью.


person Per    schedule 06.03.2017    source источник
comment
Вы решили проблему? Как? У меня такая же проблема.   -  person Makla    schedule 21.04.2017
comment
Извините еще нет. Я собираюсь вернуться к этому сейчас и буду следовать рекомендациям, перечисленным ниже.   -  person Per    schedule 21.04.2017
comment
Я добавил решение, которое сработало для меня.   -  person Per    schedule 24.04.2017


Ответы (2)


OpenIddict использует стек ASP.NET Core Data Protection для создания и защиты своих кодов авторизации, токенов обновления и токены доступа (если вы явно не выбрали JWT в качестве формата токена доступа).

Чтобы обеспечить возможность чтения этих токенов между экземплярами, необходимо настроить ASP.NET Core Data Protection для совместного использования одного и того же кольца ключей. Я рекомендую прочитать сопутствующую документацию на веб-сайте Microsoft если вам нужна дополнительная информация об этой процедуре.

person Kévin Chalet    schedule 06.03.2017
comment
Я предполагаю, что это будет иметь отношение к любой системе, которой необходимо расшифровывать данные в отдельных экземплярах? Кроме того, никогда раньше не слышал об openiddict, в настоящее время используется idsrv4, должен взглянуть. Отличная работа :) - person Mardoxx; 08.04.2017
comment
@Mardoxx да, это применимо ко всему, что использует ASP.NET Core Data Protection, включая файлы cookie для аутентификации или данные, которые вы сами шифруете с помощью IDataProtector. - person Kévin Chalet; 08.04.2017
comment
Я отмечаю это как ответ, так как он указал мне правильное направление. Ниже я добавил сообщение с некоторыми инструкциями, относящимися к кластеру Service Fabric. - person Per; 24.04.2017

Я решил это, посмотрев на это: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers#azure-and-redis

Вот основные шаги, которые я предпринял:

  1. Создайте учетную запись хранения BLOB-объектов для хранения общих ключей.

  2. Добавьте следующий код в свой 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");

Вот оно.

person Per    schedule 24.04.2017