Как настроить dotNetOpenId в среде балансировки нагрузки без сеанса


Вы, вероятно, решали эту проблему раньше.

Мне нужно иметь возможность использовать open id в среде, которая не имеет прилипчивости сеанса. Серверы сохраняют заголовки.

Я использую ASP.NET MVC и dotNetOpenId версии 3.2.0.9177. Хотя аутентификация на стороннем веб-сайте проходит без сучка и задоринки, при возврате ответа я получаю ошибку и аутентификация завершается неудачей.

Есть мысли?

3 8

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