Недопустимая подпись сообщения при выполнении Поставщика OpenId на Кластере

Введение

У нас есть Поставщик OpenID, который мы создали использование компонента DotNetOpenAuth. Все работает отлично, когда мы выполняем поставщика на единственном узле, но когда мы перемещаем поставщика в загрузку сбалансированный кластер, где несколько серверов обрабатывают запросы для каждой сессии, мы получаем проблему с сообщением, подписываясь, поскольку компонент DotNetOpenAuth, кажется, использует что-то уникальное от каждого кластерного узла для создания подписи.

Исключение

DotNetOpenAuth.Messaging.Bindings.InvalidSignatureException: Message signature was incorrect.
  at DotNetOpenAuth.OpenId.ChannelElements.SigningBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\SigningBindingElement.cs:line 139
  at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 940
  at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 172
  at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 378
  at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 493

Установка

У нас есть установка конфигурации машины для использования той же машины, включают все кластерные узлы, и у нас есть установка из сессии процесса с SQL Server.

Вопрос

Как мы настраиваем ключ, используемый DotNetOpenAuth для подписания его сообщений так, чтобы клиент доверял ответам со всех серверов в кластере во время той же сессии?

5
задан Amro 2 July 2012 в 07:32
поделиться

2 ответа

Вы должны реализовать IProviderApplicationStore и передать экземпляр этого объекта в экземпляр OpenIdProvider , который вы создаете, или установить тип хранилища в своем файл web.config. Ваша реализация этого интерфейса должна обеспечивать доступ к базе данных, которая используется всеми серверами вашей веб-фермы.

3
ответ дан 15 December 2019 в 00:56
поделиться

При создании OpenIdRelyingParty убедитесь, что в конструкторе передано значение null.

Это переводит ваш веб-сайт в режим без сохранения состояния OpenID или в «немой» режим. Для пользователей это немного медленнее для входа в систему (если вы даже заметили), но вам не нужно писать IRelyingPartyApplicationStore, чтобы позволить DotNetOpenAuth работать в вашей ферме;

var openIdRelyingParty = new OpenIdRelyingParty(null);
1
ответ дан 15 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: