Рекомендации по входу пользователей в ASP.NET

Я хочу создать систему входа в систему с помощью ASP.NET (MVC).

В Интернете я нашел несколько плохих примеров, связанных с SQL в событиях Click. Другая информация указывала на встроенного поставщика членства ASP.NET.

Тем не менее, я хочу свернуть свой собственный. Я не хочу использовать встроенный провайдер членства, так как он работает только с MS SQL, и мне не нравится идея иметь несколько сторонних таблиц в моей базе данных.

Я, наверное, мог бы что-нибудь придумать, но мне нужно несколько указателей в правильном направлении. Это не обязательно должен быть высокий уровень безопасности, а должна быть обычная безопасность на основе здравого смысла.

И у меня несколько прямых вопросов:

  1. Похоже, что во многих системах идентификатор сеанса хранится в пользовательской таблице. Я предполагаю, что это связано с привязкой сеанса к пользователю, чтобы предотвратить захват. Проверять это каждый раз, когда пользователь заходит на страницу? И что мне делать, если сессия истекает?

  2. Перемешивание, соление, что оно делает? Я знаю о хешировании MD5 и использовал его раньше. Но не солить.

  3. Лучшие практики для файлов cookie?


person Community    schedule 30.09.2008    source источник


Ответы (7)


Я не знаю о лучших практиках, но я могу рассказать вам, что я делаю. Это не высокотехнологичная безопасность, но она делает свою работу.

Я использую аутентификацию с помощью форм. Я получаю пароль, защищенный ssl, через текстовое поле на странице входа. Я беру этот пароль и хеширую его. (Хеширование похоже на одностороннее шифрование, вы можете получить хеш-код, который нельзя преобразовать обратно в пароль). Я беру этот хэш и сравниваю его с хешем пользователей в базе данных. Если хэш совпадает, я использую asp.nets, встроенный в обработку аутентификации, которая обрабатывает файлы cookie для меня.

В классе FormsAuthentication есть доступные для этого методы, такие как SetAuthCookie и RedirectFromLogin. они установят куки и пометят их как аутентифицированные. Используемый asp.net файл cookie зашифрован. Я не могу говорить о его уровне безопасности, но он довольно часто используется.

В моем классе я проверяю пароль и использую formauth для обработки остальных:

if(SecurityHelper.LoginUser(txtUsername.Text, txtPassword.Text))
{    
    FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);
}
person mattlant    schedule 30.09.2008
comment
На самом деле это не так! Это использует мою собственную аутентификацию и вообще не затрагивает структуру поставщика членства. Бьюсь об заклад, вы недавно тоже проголосовали за меня из-за этого! Я не возражаю, но вам нужно проверить аутентификацию пользовательских форм asp.net... - person mattlant; 30.09.2008
comment
Метод, который я использовал выше, \SecurityHelper.LoginUser - это мой собственный класс, который выполняет мою собственную проверку моих собственных таблиц базы данных и т. д. Метод formauth устанавливает файл cookie. Ни в одном из них не используется структура членства. - person mattlant; 30.09.2008

Вы можете реализовать своего собственного поставщика членства, используя инфраструктуру ASP.NET, см. документы MSDN для класса MemberShipProvider.

person axel_c    schedule 30.09.2008

Встроенный провайдер работает хорошо. Это действительно работает с MySQL, хотя я обнаружил, что это не так просто, как версия MS SQL. Если вы можете использовать, то сделайте, это сэкономит вам часы работы.

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

person DaveF    schedule 30.09.2008

Соление — это практика добавления уникальной строки символов к тому, что хэшируется. Предположим, mySalt = abc123 и мой пароль passwd. В PHP я бы использовал hashResult = md5(mySalt + password).

Предположим, что строка перехвачена. Вы пытаетесь сопоставить строку, но в итоге получаете тарабарщину, потому что перед шифрованием пароль был засолен. Просто помните, что все, что вы используете для соли, должно быть непрерывным на протяжении всего приложения. Если вы посолите пароль перед сохранением, вы должны сравнить хешированный посоленный пароль с БД.

person Jarrett Meyer    schedule 30.09.2008

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

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

На сайте asp.net есть хорошая серия руководств:

текст ссылки

person Ken Ray    schedule 30.09.2008

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

public void SignIn(User user)
        {
            FormsAuthentication.SignOut();
           var ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now.AddMinutes(30), expires, alse, null);
            var encryptedTicket = FormsAuthentication.Encrypt(ticket);
            var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
            {
                Expires = ticket.Expiration
            };

            httpContextProvider.GetCurrentHttpContext().Response.Cookies.Add(authCookie);
        }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }

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

person Paco    schedule 30.09.2008
comment
Зачем ты все это делаешь? Есть ли в этом преимущество перед вызовом FormsAuthentication.SetAuthCookie? (который делает все, что вы только что сделали вручную iirc) - person mattlant; 30.09.2008
comment
Или redirectFromLoginPage в этом отношении. Они оба устанавливают куки, не используя какую-либо членскую хрень от MS. - person mattlant; 30.09.2008
comment
Я могу вручную установить время истечения срока действия, использовать свою собственную ролевую модель без использования memberProvider. Кроме того, приведенный выше код скопирован из класса Authenticator: IAuthenticator с внедренным httpcontext. - person Paco; 30.09.2008
comment
интересный. я понимаю срок действия, но я не уверен, что вы имеете в виду о своем образце для подражания. Можете ли вы уточнить. (Я всегда стремлюсь изучать новые способы делать что-то, поэтому я надеюсь, что вы не возражаете) - person mattlant; 30.09.2008
comment
Не могли бы вы еще раз взглянуть на мой код. он не использует членство! - person mattlant; 30.09.2008

Я бы избегал всей проблемы и использовал openid. Доступна библиотека, которую вы можете использовать напрямую. Вот ссылка на сообщение в блоге о том, как это реализовать

person Peter Marshall    schedule 30.09.2008