Ошибка корреляции, удаленный вход. Сервер идентификации AspNet Core

Пытаюсь получить общее представление о том, как работает этот процесс, поскольку я получаю сообщение об ошибке Correlation failed. Позвольте мне сначала начать описание проблемы, с которой я сталкиваюсь ...

QAT не работает должным образом и настроен следующим образом:

У меня есть сервер идентификации, работающий за балансировщиком нагрузки для QAT.
Все запросы, отправляемые в балансировщик нагрузки, идут по https. Трафик, перенаправляемый на каждый сервер приложений (в данном случае 2 отдельных сервера), - это http. Netscaler добавляет в заголовок все необходимые элементы X-Forwarded.

У меня есть другое приложение, которое также стоит за балансировщиком нагрузки для QAT. Есть 2 отдельных сервера, на которых размещено это приложение, на которые netscaler будет перенаправлять трафик. Это приложение настроено на использование информации X-Forwarded от netscaler. Он предназначен для аутентификации с использованием вышеупомянутого Identity Server.

Моя проблема в том, что при развертывании в QAT у меня возникает бесконечный цикл между вторым приложением и Identity Server. Для меня это странно, так как моя среда SYS работает отлично. В моей системной среде есть отдельный экземпляр Identity Server и второе упомянутое приложение (за исключением того, что перенаправляется только один экземпляр каждого приложения). Это также проходит через netscaler и выполняет всю упомянутую ранее магию X-Forwarded.

В обоих случаях настройка идентична. Единственное отличие состоит в том, что QAT имеет несколько серверов, на которых размещено каждое приложение, а SYS имеет только 1 сервер, на котором размещено каждое приложение.

Мой вопрос в том, почему это должно вести себя по-другому? Почему это работает в sys, а не в qa?

Я думаю, что на этом этапе мы можем исключить путь обратного вызова, настройки файлов cookie и т.д ... b / c, это работает в SYS. Может быть, мне нужно внедрить некоторую язвочку промежуточного программного обеспечения Data Protection Key как на сервере идентификации, так и в другом приложении? Кстати, я действительно не понимаю ключей защиты данных. Будет ли как серверу идентификации, так и отдельному приложению хранить свои ключи в одном месте (будь то база данных или файловая система), чтобы иметь возможность расшифровать информацию, хранящуюся в файле cookie ...

Любая помощь приветствуется.


person user1931270    schedule 15.11.2019    source источник


Ответы (1)


Определенно проблема заключалась в ключах защиты данных. Мое решение было простым. Сохраните ключ шифрования как часть процесса развертывания, создайте IXmlRepository, а затем добавьте его в автозагрузку. Очень просто.

    using Microsoft.AspNetCore.DataProtection.Repositories;
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Linq;

namespace Myapp.Encryption.Repositories
{
    public class EncryptionRepository : IXmlRepository
    {
        private String Key { get; set; }
    public EncryptionRepository()
    {
        var year = Convert.ToString(DateTime.Now.Year + 2);
        var key = "<key id=\"983440f7-626b-46e4-8bfa-7c3d6d9d4619\" version=\"1\">" + 
                  "    <creationDate>2019-11-13T17:42:58.889085Z</creationDate>" + 
                  "    <activationDate>2019-11-13T17:42:58.3843715Z</activationDate>" + 
                  "    <expirationDate>" + year + "-02-11T17:42:58.3843715Z</expirationDate>" + 
                  "    <descriptor deserializerType=\"Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60\">" + 
                  "        <descriptor>" + 
                  "            <encryption algorithm=\"AES_256_CBC\" />" + 
                  "            <validation algorithm=\"HMACSHA256\" />" + 
                  "            <masterKey p4:requiresEncryption=\"true\" xmlns:p4=\"http://schemas.asp.net/2015/03/dataProtection\">" + 
                  "                <value>{{Your Encryption Key }}</value>" + 
                  "            </masterKey>" + 
                  "        </descriptor>" + 
                  "    </descriptor>" + 
                  "</key>";
        Key = key;
    }

    public IReadOnlyCollection<XElement> GetAllElements()
    {
        var collection = new List<XElement>();
        collection.Add(XElement.Parse(Key));
        return collection;
    }

    public void StoreElement(XElement element, String friendlyName)
    {
        // Not required as key is hard coded
    }
}

}

services.AddSingleton<IXmlRepository, EncryptionRepository>();    
services.AddDataProtection().AddKeyManagementOptions(a => a.XmlRepository = (services.BuildServiceProvider()).GetService<IXmlRepository>());
person user1931270    schedule 18.11.2019
comment
Примечание. Это не мое окончательное решение, и я не планирую сохранять этот подход в долгосрочной перспективе. Я намерен создать сервис для хранения и получения ключей. На этом этапе я изменю код элемента Store, чтобы фактически генерировать ключи по мере их истечения ... Я предоставляю это только в качестве объяснения ... - person user1931270; 18.11.2019
comment
Также стоит отметить. Прикрепленные сеансы на Netscaler также решают проблему, описанную выше. Я закончил тем, что не пошел по этому маршруту, так как липкие сеансы привели к несбалансированному нарушению работы компьютеров. - person user1931270; 18.11.2019