Реализация OpenID в ASP.net "Правильно" - поставщик членства или аутентификации?

Существует несколько способов использования OpenID на сайтах ASP.net, но ни один из них, похоже, не использует существующий механизм поставщиков членства и аутентификации.

Интересно, каким образом можно было бы создать сайт, который опирается только на OpenID? Продолжая использовать Аутентификацию форм, но реализуя вариант SqlMembershipProvider, который выполняет поиск по OpenID?

Или я пойду на один уровень глубже и напишу свой собственный FormsAuthenticationModule? Кажется, что это слишком голые кости, поскольку (насколько мне известно) Forms Authentication может искать против любого источника данных.

Или есть третий способ, поддерживающий FormsAuthenticationModule, но заставляя его искать OpenID?

Как это делается для ASP.net MVC-приложения, я не использую встроенные элементы управления WebForms Login, если это имеет значение.

Ответы

Ответ 1

API-интерфейс членства, который определяет ASP.NET, совсем не подходит OpenID, поэтому, вероятно, вы не видите, что многие системы используют его. Я еще не видел необходимости использовать провайдера членства с OpenID, поэтому он действительно не стал проблемой. Один проект, который попытался сделать модель поставщика членства подходящей с OpenID, http://code.google.com/p/dotnet-membership-provider/, но похоже, что он не поддерживался в последнее время.

Как сказал womp, вам не нужно переделывать FormsAuthenticationModule. Он отлично работает с OpenID.

Ознакомьтесь с шаблонами проектов, которые поставляются с DotNetOpenAuth посмотреть, как все может работать без поставщика членства.

Ответ 2

Проект Проект OpenID Membership Provider может быть тем, что вы ищете.

И даже если вы не используете элементы управления Login, по-прежнему рекомендуется использовать модель поставщика членства для аутентификации.

Как правило, это не так важно, как реализация специфических функций FormsAuthentication, поскольку писать членствоProvider довольно тривиально, и я никогда не нашел случая, когда он был недостаточно гибким для обработки. Обратите внимание, что часто вам нужно только реализовать один метод (ValidateUser()) интерфейса, чтобы получить работающего провайдера.

Ответ 3

Это старый вопрос, но я не видел подхода, который я использовал при поиске по нему, поэтому здесь. (Он тестировался только с Google, так как я создаю внешний вид интеграции с моей учетной записью Google Apps для бизнеса, а не полной интеграцией OpenID.)

Я использую DotNetOpenAuth, чтобы требовать OpenID, обязательно требуя адрес электронной почты.

        request.AddExtension(new ClaimsRequest
        {
            BirthDate = DemandLevel.NoRequest,
            Email = DemandLevel.Require,
            FullName = DemandLevel.Require
        });

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

            case AuthenticationStatus.Authenticated:
                ClaimsResponse info = response.GetExtension<ClaimsResponse>();
                string username = Membership.GetUserNameByEmail(info.Email);
                FormsAuthentication.SetAuthCookie(username, true);
                return Redirect(ReturnUrl ?? "/");

Предполагая, что у вас также установлен поставщик членства и ролей, установка форм Auth cookie для соответствующего имени пользователя дает вам доступ ко всем другим преимуществам членства и ролей.

Ответ 4

Образец ASP.NET MVC, включенный в DotNetOpenId, использует FormsAuthentication для входа пользователя в систему после того, как он был аутентифицирован OpenID. Это, насколько я могу судить, не делает никакой интеграции с системой членства.

Ответ 5

если кто-нибудь встретит хороший пример С# janrain - сообщите мне.

У меня есть dsn, указывающий на tumblr, затем для виджета входа он возвращается в субдомен, где у меня есть путь к папке под корнем.

так что у меня есть папка app_code, в которой я использую этот класс С# helper - я могу получить токен обратно просто отлично, и это приведет меня к моему member.domain.com, так что виджет работает - просто нужно получить сведения о пользователе у поставщика, к которому они привыкли добраться до области участников.

http://groups.google.com/group/rpx-developers/web/c-helper-class?_done=/group/rpx-developers%3F

- вспомогательный класс

Ошибка

Ошибка сервера в приложении "/". Неожиданная ошибка API Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека, чтобы получить дополнительную информацию об ошибке и где она возникла в коде.

Сведения об исключении: System.Exception: Неожиданная ошибка API

Ошибка источника:

Строка 22: Строка 23: Rpx feedit = новый Rpx ( "apikey", " https://learnbartending.rpxnow.com/" ); Строка 24: feedit.AuthInfo(justoken); Строка 25: XmlElement xmlstuff = feedit.AuthInfo(justoken); Строка 26:

Исходный файл: c:\Inetpub\vhosts\learnbartending.com\httpdocs\members\Default.aspx.cs Строка: 24

Трассировка стека:

Ответ 7

Если вам нужно использовать userID(guid) из вашей базы данных членства, тогда вам придется создавать скелетную учетную запись при первом входе в систему, а затем выяснить какой-то механизм поворота нового пароля при последующих входах. Этот пароль, очевидно, будет для вашего провайдера членства и будет прозрачным.

Теперь интересная часть - найти метадат, который является общим? Возможно, адрес электронной почты HMM?

Я работаю над этой дилеммой, а также с подключением к facebook. Я должен иметь идентификатор пользователя, чтобы связать их с классифицированными сообщениями в моей базе данных.

Забавные вещи.

Просто обновление. Я получил эту работу красиво.

Я создал таблицу

CREATE TABLE [dbo].[OAuthUsers]
(
    [OuthUserID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [uniqueidentifier] NOT NULL,
    [access_token] [varchar](150) NULL,
    [expires_in] [datetime2](7) NULL,
    [refresh_token] [varchar](150) NULL,
    [issued_at] [datetime2](7) NULL,
    [user_id] [varchar](50) NOT NULL,
    [domain] [varchar](50) NULL,
    [scope] [varchar](150) NULL,
    CONSTRAINT [PK_OAuthUsers] PRIMARY KEY CLUSTERED
)

Сохраните access_token для facebook или openid. OpenID имеет токен обновления, который вы можете запросить, поэтому сохраните его

У меня есть обработчик ashx как мой redirect_url. В этом обработчике вы можете выполнять всю обработку для каждого случая, у пользователя уже есть учетная запись в базе данных поставщика, у пользователя нет учетной записи в базе данных поставщика, поэтому мы ее создаем. Все это аккуратное дерьмо:)

Удачи с ним.