Вы, наверное, уже решали это раньше.

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

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

Любые мысли?

8
Mihai Lazar 4 Сен 2009 в 17:11

3 ответа

Лучший ответ

С отслеживанием состояния

Наиболее оптимизированный метод - написать собственное хранилище сохраняемости, которое реализует IRelyingPartyApplicationStore для "секретов", требуемых RP OpenID, и передать ваш экземпляр конструктору OpenIdRelyingParty(IRelyingPartyApplicationStore) или зарегистрировать его в вашем файл web.config.

Без гражданства

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

Вы можете активировать режим без сохранения состояния, создав экземпляр OpenIdRelyingParty, передав null в качестве экземпляра магазина приложений. Вызов конструктора по умолчанию заставит DNOA использовать свое хранилище в памяти, которое не работает на фермах серверов, поэтому конструктора по умолчанию недостаточно.

Или, если вы используете элементы управления ASP.NET, просто установите для элемента управления Stateless = true.

6
Andrew Arnott 5 Сен 2009 в 01:31
Спасибо. Часть без гражданства, кажется, исправила это.
 – 
Mihai Lazar
7 Сен 2009 в 14:13

Вот как мы включаем режим без сохранения состояния:

var uri = new Uri(Request.Url, Request.RawUrl);
var openid = new OpenIdRelyingParty(null, uri, 
             Request.HttpMethod == "GET" ? Request.QueryString : Request.Form);

Кажется, пока работает, хотя, по словам Эндрю, есть небольшое снижение производительности. Не уверен, что это имеет значение, поскольку вход в систему - довольно редкое действие.

5
Jeff Atwood 15 Окт 2009 в 22:21
Этот конструктор с тремя параметрами подходит для DotNetOpenId 2.x, тогда как конструктор с одним параметром для режима без сохранения состояния подходит для DotNetOpenAuth 3.x.
 – 
Andrew Arnott
16 Окт 2009 в 05:09
Спасибо, мистер Coding Horror / Один из создателей stackoverflow. Я попробую в понедельник утром.
 – 
Mihai Lazar
23 Окт 2009 в 21:04

Используя DotNetOpenID, вы должны иметь возможность сохранять необходимое состояние во время аутентификации для клиента с помощью файла cookie.

Изменить: у меня нет примера кода для этого, потому что мне никогда не приходилось использовать DotNetOpenID в среде без сеанса, но я бы проверил эту ссылку, она может предоставить вам необходимую информацию : http://code.google.com/p/dotnetopenid/wiki/WebFarmHowto

1
mkchandler 4 Сен 2009 в 22:17
Я использовал что-то подобное для хранения чего-то в TempData, но есть ли примеры кода для DotNetOpenID? Я еще не знаком с этим. Спасибо
 – 
Mihai Lazar
4 Сен 2009 в 21:11
У меня нет под рукой примеров кода, но посмотрите ссылку, которую я предоставил.
 – 
mkchandler
4 Сен 2009 в 22:18