Проверка подлинности ASP.NET MVC с использованием пользовательской базы данных вместо ASPNETDB?

25

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

Вопросы:

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

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

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

Обновление

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

Теги:
sql-server
authentication
asp.net-mvc

5 ответов

16
Лучший ответ

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

  • 0
    Я прочитал в другом посте stackoverflow, что нам нужно реализовать IActionFilter для выполнения пользовательской аутентификации. Какой путь правильный?
  • 0
    @James FWIW вот кешированная ссылка Google: webcache.googleusercontent.com/…
12

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

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

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

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

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

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

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

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

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

  • 0
    Authorize атрибут или UserAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter ? Пользовательское членство с использованием пользовательского SQL Server для Forms Auth ? Может быть, custom Role Provider ?
1

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

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

  • 0
    вы используете пользовательское членство, используя пользовательский SQL Server ? FormsAuthentication.RedirectFromLoginPage в каждом контроллере или фильтре ? хранить в UserName parameter , какой объект?
1

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

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

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

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

  • 0
    Служба аутентификации называется ( IsValidLogon ) с каждого контроллера ? FormsAuthentication.RedirectFromLoginPage(username, createCookieBool); вызывается в любом контроллере?
1
  • Нет. И я бы подозревал, что большинство людей не доверяют этому кропотливому механизму

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

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

  • 0
    Спасибо за ваш ответ, но ваш ответ для # 3 - это сообщение на форуме об аутентификации с использованием веб-форм ASP.NET, а не ASP.NET MVC. Есть ли какие-то различия, о которых мне нужно знать в процессе работы с MVC?
  • 0
    Это один и тот же механизм для MVC и веб-форм.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню