Введение
У нас есть Поставщик 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 для подписания его сообщений так, чтобы клиент доверял ответам со всех серверов в кластере во время той же сессии?
Вы должны реализовать IProviderApplicationStore
и передать экземпляр этого объекта в экземпляр OpenIdProvider
, который вы создаете, или установить тип хранилища в своем файл web.config. Ваша реализация этого интерфейса должна обеспечивать доступ к базе данных, которая используется всеми серверами вашей веб-фермы.
При создании OpenIdRelyingParty убедитесь, что в конструкторе передано значение null.
Это переводит ваш веб-сайт в режим без сохранения состояния OpenID или в «немой» режим. Для пользователей это немного медленнее для входа в систему (если вы даже заметили), но вам не нужно писать IRelyingPartyApplicationStore, чтобы позволить DotNetOpenAuth работать в вашей ферме;
var openIdRelyingParty = new OpenIdRelyingParty(null);