Подтвердить что ты не робот

Аутентификация ASP.NET MVC с использованием пользовательской базы данных вместо ASPNETDB?

У меня уже есть таблица User в моей основной базе данных приложения с адресом электронной почты (который будет действовать как имя пользователя) и пароль. Я хотел бы выполнить аутентификацию с использованием моей базы данных вместо базы данных аутентификации по умолчанию (ASPNETDB).

Вопросы:

  • Это плохая идея? Это огромная возможность червей использовать мою собственную БД для аутентификации?

  • Сколько работы я добавляю, делая это? У меня уже есть код для хэширования пароля и запроса, который будет проверять соответствие имени и пароля БД. Итак, я бы не начинал с нуля.

  • Что мне нужно сделать, чтобы использовать мою базу данных вместо ASPNETDB? Я надеюсь, что это можно описать несколькими простыми шагами, но если нет, можете ли вы указать мне хороший источник?

Обновление

Я по-прежнему ищу еще немного подробностей здесь по моему третьему вопросу. Нужно ли мне писать свой собственный MembershipProvider? Какие изменения мне необходимо внести в файл web.config? Будет ли атрибут [Authorize] работать, если я напишу собственное решение? Могу ли я использовать автоматически созданный AccountController с некоторыми незначительными изменениями или мне в основном нужно переписать контроллер учетной записи с нуля?

4b9b3361

Ответ 1

Это довольно просто, вам нужно устрашить MemberhipProvider и реализовать метод ValidateUser. Взгляните на post. Я использую пользовательский поставщик членства с Postgres и MVC просто отлично.

Ответ 2

Я отвечу на ваши обновленные вопросы:

Мне нужно написать свой собственный MemberhipProvider?

Если вы (а) хотите продолжить использование проверки подлинности с помощью форм и (b) иметь структуру таблицы авторизации, которая не соответствует тем же соглашениям, что и ASPNETDB, то да. Если вам не нужен FormsAuth (см. Ниже), вы можете полностью отказаться от MembershipProvider, но я бы не рекомендовал его. Или, если вы используете те же самые таблицы безопасности, что и ASPNETDB, но просто хотите указать его на другую базу данных, вы можете продолжить использовать поставщик по умолчанию и просто изменить его конфигурацию.

Какие изменения мне нужно внести в файл web.config?

Если вы используете свой собственный MembershipProvider, вам необходимо зарегистрировать его в разделе <providers> элемента <membership> и изменить свойство defaultProvider. Если вы используете стандартный AspNetSqlProvider, вам, вероятно, просто нужно будет изменить строку подключения.

Будет ли атрибут [Authorize] работать, если я напишу собственное решение?

Да, если вы придерживаетесь аутентификации форм (либо используйте AspNetSqlProvider, либо напишите и зарегистрируйте свой собственный членский провайдер). Нет, если вы откажетесь от проверки подлинности с помощью форм (опять же, не рекомендуется).

Можно ли использовать автоматически созданный AccountController с некоторыми незначительными изменениями или мне в основном нужно переписать контроллер учетной записи с нуля?

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

Ответ 3

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

  • Не так много, тем более, что у вас уже есть таблица.

  • Взгляните на это, например: http://forums.asp.net/t/1250726.aspx

Ответ 4

Мы делаем именно это в одном из наших приложений и находим его довольно простым. У нас есть служба проверки подлинности (называемая контроллером), которая обрабатывает механику хэширования введенного пароля, чтобы убедиться, что это совпадение, а затем просто возвращает bool для метода, который мы называем "IsValidLogon".

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

Мы принципиально игнорировали ASPNETDB. Если мы получим правильный ответ от нашей проверки пользователя/пароля, мы просто вызываем стандартную форму FormsAuthentication.RedirectFromLoginPage(имя пользователя, createCookieBool);

Надеюсь, что это поможет.

Ответ 5

просто строить то же самое, поэтому ответ на 1 должен быть НЕТ:) Я использую стандартную аутентификацию форм asp.net, где я использую метод FormsAuthentication.RedirectFromLoginPage(имя пользователя, createCookieBool) для входа пользователя в систему. Я дал пользователю уникальный guid (вы можете использовать любой другой идентификатор пользователя), и я сохраняю его в параметре UserName вместе с именем пользователя (для отображения на главной странице: Html.Encode(Page.User.Identity.Name.Split( "|".ToCharArray()) [1]))

В каждом контроллере/методе, в котором я должен знать, какой пользователь зарегистрирован (через User.Identity.Name, разделите строку и получите userguid). Также я украшаю эти процедуры атрибутом [Authorize].