Использование OpenID (через DotNetOpenAuth) вместе с ролями пользователей и другими функциями поставщика членства - PullRequest
29 голосов
/ 10 июля 2010

Я создаю сайт ASP.NET MVC, где я хочу использовать DotNetOpenAuth для реализации входа в систему OpenID (я полностью удаляю имя пользователя / пароль на основе пароля).

До сих пор я писал свой код для системы имени пользователя / пароля по умолчанию с поставщиком членства ASP.NET, используя систему ролей, систему профилей и базовую систему регистрации. Теперь, когда я перехожу на OpenID, я предвижу некоторые проблемы, в частности, с взаимодействием с элементами управления членством, предоставляемыми поставщиком членства ASP.NET .

Глядя на образец DotNetOpenAuth MVC, я вижу, что единственными ссылками на систему FormsAuthentication являются создание AuthCookie и позже для вызова FormsAuthentication.SignOut(). Таким образом, я не уверен, могу ли я использовать функции поставщика членства ASP.NET с этой системой OpenID, хотя другая часть примера кода вызывает User.Identity.IsAuthenticated.


Будет ли этот системный интерфейс OpenID взаимодействовать с поставщиком членства ASP.NET? Если нет, можно ли как-то это исправить?

Если вышеперечисленное совершенно невозможно, я думаю, что моим следующим шагом будет просто свернуть мои собственные таблицы базы данных и вручную написать код для их использования из моего контроллера учетных записей. Я заметил, что Stack Exchange Data Explorer использует этот подход, но будет ли это правильным решением?


РЕДАКТИРОВАТЬ: Просто чтобы убедиться, что я использую правильную терминологию, под «провайдером членства ASP.NET» я имею в виду провайдера, который использует таблицы, сгенерированные инструментом aspnet_regsql.exe.

1 Ответ

40 голосов
/ 12 июля 2010

Они будут нормально взаимодействовать, но вам нужно будет немного поработать.

Что я делал в прошлом, так это:

Сначала я предполагаю, что у вас есть полуработающая реализация openid, то есть вы можете получить реальную идентификацию от поставщика openid, но просто не знаете, что с ней делать.

Я продолжаю использовать FormsAuthentication в качестве серверной части, даже не используя ее для аутентификации.

Вам понадобится таблица базы данных, которая позволяет привязать пользователя FormsAuthentication к одному или нескольким openids. Вы можете просто сохранить имя пользователя FormsAuthentication (которое еще не существует) с идентификатором URL, который вы получаете от поставщика openid. Мы назовем этот стол AUTH

Когда кто-то аутентифицируется на вашем сайте с помощью openid, проверьте, существует ли он в таблице AUTH. Если нет, вам нужно сделать две вещи. Вызовите Membership.CreateUser (), передав любое сгенерированное имя пользователя (или адрес электронной почты, если он предоставлен openid). Я использую GUID для пароля, поскольку он не будет использоваться. Одновременно поместите запись в таблицу AUTH, отображающую имя пользователя Membership в заявленную идентификационную информацию openid.

Когда кто-то аутентифицируется на вашем сайте с открытым идентификатором, и он уже существует, вызовите FormsAuthentication.RedirectFromLoginPage с именем пользователя, связанным с openid, и все соответствующие билеты для аутентификации будут установлены.

Теперь вы можете использовать все красивые встроенные объекты безопасности, как всегда, до реализации openid.

EDIT: В качестве дополнительного преимущества этой настройки у вас есть возможность в будущем разрешить вход в систему по имени пользователя / паролю.

Вы также можете поменять своего участника в любое время.

Кроме того, таблица AUTH «многие к одному» позволяет легко связать несколько открытых элементов.

...