Недопустимая подпись сообщения при запуске поставщика OpenId в кластере - PullRequest
5 голосов
/ 24 марта 2010

Введение

У нас есть провайдер 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 для подписи своих сообщений, чтобы клиент доверял ответам со всех серверов в кластере в течение одного сеанса?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

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

1 голос
/ 24 марта 2010

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

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

var openIdRelyingParty = new OpenIdRelyingParty(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...