Проверка подлинности пользователя без состояния сеанса в ASP.NET

Одним из требований, предлагаемых для приложения ASP.NET, является глобальное отключение состояния сеанса. (Это не подлежит обсуждению.)

Еще одно требование - наличие средств аутентификации пользователей. Я думаю об использовании модели поставщика членства в ASP.NET.

Возможна ли аутентификация пользователя без состояния сеанса?

Мы ищем следующие конкретные примеры аутентификации пользователей:

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

Есть ли способ сделать это с помощью файлов cookie?

Можно ли сделать это безопасно, чтобы файл cookie нельзя было легко подделать?

Есть ли в ASP.NET встроенные функции для поддержки этого, или нам нужно будет развернуть наш собственный метод?


person frankadelic    schedule 03.04.2009    source источник


Ответы (3)


Проверка подлинности с помощью форм ASP.NET не использует SessionState. Он использует файл cookie для хранения билета проверки подлинности.

Вы также можете принудительно отправить билет проверки подлинности по каналу SSL, отредактировав файл web.config.

Все необходимые вам функции доступны в ASP.NET.

http://msdn.microsoft.com/en-us/library/aa480476.aspx

person mmx    schedule 03.04.2009
comment
Отлично ... похоже, мне нужно, чтобы validationKey и decryptionKey были идентичны на всех серверах в веб-ферме, чтобы это работало. - person frankadelic; 04.04.2009
comment
если вы работаете на веб-ферме, то да. - person mmx; 04.04.2009

Конечно, это сделает файл cookie.

Подумайте об основах. В любом случае состоянием сеанса управляют файлы cookie.

Вот что ты делаешь.

Когда они входят в систему, вы берете их идентификатор пользователя и тайм-аут (так что вход в систему длится, скажем, 30 минут или что-то еще).

Возьмите эту строку и хешируйте ее.

(java, не важно)

String cookie = userid + ":" + timeString + ":" + md5(userid + ":" + timeString + ":" + "secretpassword");

Затем, когда запрос попадет на ваш сайт, проверьте файл cookie. Сначала проверьте его на целостность.

String parts[] = cookie.split(":");
String newHash = md5(parts[0] + ":" + parts[1] + ":" + "secret password");
if (!newHash.equals(parts[2])) {
    // boom, cheater!
}

Затем проверьте строку времени, чтобы убедиться, что они все еще «вошли в систему», и переходите оттуда.

Убедитесь, что вы уделяете время обновлению файла cookie при каждом запросе.

person Will Hartung    schedule 03.04.2009
comment
Однако с точки зрения безопасности это довольно плохая практика. Если секретный пароль просочился один раз, любой желающий может войти в приложение. А если он слабый, то его можно взломать (особенно, когда гаснет MD5). Если вы собираетесь сделать это, по крайней мере, используйте разные случайные секреты для каждого пользователя. Так было бы намного безопаснее. - person dr. evil; 04.04.2009
comment
Как бы вы управляли другим сеансом «ключ для каждого пользователя для аутентификации»? - person yfeldblum; 04.04.2009
comment
Это проблема управления ключами, у вас такая же проблема с любым шифрованием. Не нравится MD5, выберите SHA. Это пример техники. - person Will Hartung; 04.04.2009
comment
@Justice - просто сгенерируйте случайный пароль для каждого пользователя при их создании и поместите его в их пользовательскую запись. Поскольку здесь у вас есть идентификатор пользователя, его просто найти для каждого пользователя. - person Will Hartung; 04.04.2009

Да, вы можете использовать файлы cookie.

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

Для файлов cookie вы можете поставить отметку времени и зашифровать значения файлов cookie. Обычно я не управляю состоянием аутентификации пользователя. Я использую встроенные классы FormsAuthentication для управления этим аспектом моих веб-приложений.

Крупные сайты, такие как Myspace и Live Search Club, полагаются исключительно на файлы cookie в качестве управления состоянием.

person Chuck Conway    schedule 03.04.2009