Как настроить dotNetOpenId в среде балансировки нагрузки без сеанса
Вы, вероятно, решали эту проблему раньше.
Мне нужно иметь возможность использовать open id в среде, которая не имеет прилипчивости сеанса. Серверы сохраняют заголовки.
Я использую ASP.NET MVC и dotNetOpenId версии 3.2.0.9177. Хотя аутентификация на стороннем веб-сайте проходит без сучка и задоринки, при возврате ответа я получаю ошибку и аутентификация завершается неудачей.
Есть мысли?
3 ответа:
Stateful
Наиболее оптимизированным методом является написание пользовательского хранилища сохраняемости, реализующегоIRelyingPartyApplicationStore
для "секретов", которые требуются OpenID RPs, и передача экземпляра в конструкторOpenIdRelyingParty(IRelyingPartyApplicationStore)
или регистрация его в вашем web.конфигурационный файл .Без гражданства
Гораздо более простым решением, которое будет достаточно для большинства сценариев, является использование режима без состояния, так что нет необходимости совместно использовать состояние на серверах веб-фермы.
Вы можете активируйте режим без состояния, создав экземпляр
OpenIdRelyingParty
, передавnull
в качестве экземпляра хранилища приложений. Вызов конструктора по умолчанию приведет к тому, что DNOA будет использовать свое хранилище в памяти, которое разрывается на фермах серверов, поэтому конструктор по умолчанию недостаточен.Или если вы используете ASP.NET элементы управления, просто установите
Stateless = true
на элементе управления.
Вот как мы включаем режим без состояния:
var uri = new Uri(Request.Url, Request.RawUrl); var openid = new OpenIdRelyingParty(null, uri, Request.HttpMethod == "GET" ? Request.QueryString : Request.Form);
Кажется, работает до сих пор, хотя на Эндрю есть небольшой хит производительности. Не уверен, что это имеет значение, так как вход в систему-довольно редкая активность.
Используя DotNetOpenID, вы должны быть в состоянии сохранить состояние, которое вам нужно во время аутентификации клиента с помощью файла cookie.
Edit: у меня нет примера кода для этого, потому что мне никогда не приходилось использовать DotNetOpenID в среде без сеанса, но я бы проверил эту ссылку, она может предоставить вам необходимую информацию: http://code.google.com/p/dotnetopenid/wiki/WebFarmHowto