Аутентификация в ASP.NET
ОГЛАВЛЕНИЕ
ASP.NET исполняет web-приложения под учетной записью ASPNET. Это означает, что при выполнении задачи, не предусмотренной привилегиями пользователя (например, запись файла на диск), приложение получает отказ в доступе.
Идентификация пользователей применяется в тех случаях, когда нужно предоставить доступ к разделам web -приложения только для определенных пользователей. Это может быть Internet -магазины, форумы, закрытые разделы в корпоративных Intranet -сайтах и так далее.
Безопасность в приложениях ASP.NET основана на трех операциях:
- Аутентификация - процесс идентификации пользователя для предоставления доступа к какому-то ресурсу приложения (разделу сайта, странице, базе данных, :). Аутентификация основана на проверке сведений о пользователе (например, имени и пароля);
- Авторизация - процесс предоставления доступа пользователю на основе данных аутентификации;
- Олицитворение (impersonalisation) - предоставление серверному процессу ASP.NET прав доступа клиента.
- аутентификация Windows - применяется для идентификации и авторизации пользователей в зависимости от привилегий учетной записи пользователя. Работает аналогично обычным механизмам сетевой безопасности Windows и выполняется контроллером домена;
- аутентификация Forms - пользователь вводит логин и пароль в Web -форме, после чего авторизация происходит по списку пользователей, хранящемуся, например, в базе данных. Применяется на большинстве Internet-сайтов при регистрации в Inernet -магазинах, форумах, пр;
- аутентификация Passport - все пользователи имеют единое имя и пароль, используемые для сайтов, использующих данный тип авторизации. Пользователи регистрируются в службе Microsoft Passport.
Тип аутентификации указывается в конфигурационном файле Web.config :
<authentication mode= "[Windows/Forms/Passport/None]">
</authentication>
По умолчанию применяется тип аутентификации Windows. Значение None имеет смысл устанавливать если используется собственная схема аутентификации или анонимный доступ (для повышения производительности).
Аутентификация Windows
Существует 4 типа аутентификации Windows : обычная ( basic ), краткая ( digest ), встроенная ( integated ) и на основе клиентских сертификатов SSL. Обычную и краткую аутентификацию применяют для идентификации имени пользователя и пароля, указываемом в диалоговом окне. Они хорошо работают в Internet , так как данные передаются по HTTP. Базовая аутентификация передает пароль и имя пользователя в кодировке Base 64, которую легко раскодировать. Для повышения безопасности можно использовать базовую аутентификацию совместно с SSL. Базовую аутентификация поддерживают большинство браузеров.
Краткая аутентификация является более безопасной, так как пароль шифруется по алгоритму MD 5. Она поддерживается браузерами Internet Explorer 5.0 и выше, либо на клиентской машине должен быть установлен. NET Framework. Кроме этого, учетные записи пользователей должны храниться в Active Directory.
Встроенная аутентификация применяется для идентификации учетных записей Windows и не может применяться в Internet , так как клиент и сервер должны пройти проверку контроллером домена. При этом пароли по сети не передаются, что увеличивает безопасность приложения. Этот тип аутентификации блокируется файрволами и работает только с Internet Explorer. Встроенная аутентификации немного медленнее, чем базовая или краткая.
Применение сертификатов SSL так же обычно применяется в Intranet , т.к. требует раздачи цифровых сертификатов. При этом типе аутентификации пользователям не нужно регистрироваться. Сертификаты можно сопоставить учетным записям пользователей в домене или Active Directory.
Для указания способа аутентификации нужно выполнить следующие действия:
1. Запустить диспетчер IIS
2. Щелкнуть правой кнопкой мыши по приложению и выбрать в контекстном меню Свойства.
3. В появившимся диалоге перейти на вкладку Безопасность каталога и нажать кнопку Изменить в разделе Анонимный доступ и проверка подлинности.
5. Указать права доступа к папке или отдельным файлам в папке Web -приложения. Обязательно нужно разрешить доступ для пользователя ASPNET.
Для поддержки URL-авторизации при Windows-аутентификации для защиты содержимого папок применяются Web.config файлы, находящиеся в этих папках. Структура файла такова (cимвол <*> означает всех пользователей):
<configuration>
<system.web>
<authorization>
<allow users="VISUALDESIGN\DENIS" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
<configuration>
<system.web>
<authorization>
<allow roles="VISUALDESIGN\ADMINS" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
<configuration>
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
<location path="Checkout.aspx">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
bool authenticated = User.Identity.IsAuthenticated ;
string name = User.Identity.Name;
bool admin = User.IsInRole("Admins");
Forms-аутентификация
При использовании Forms-аутентификации запрос параметров регистрации (например, логина и пароля) происходит в web-форме. Регистрационная страница указывается в файле Web.config. При первом обращении к защищаемым страницам ASP.NET перенаправляет пользователя на страницу для ввода пароля. При успешной регистрации аутентификационные данные сохраняются в виде cookie и при повторном обращении к защищенным страницам регистрация не требуется.Для того, чтобы использовать Forms-аутентификацию в файле Web.config в корневой папке приложения нужно указать страницу для ввода пароля:
<authentication mode="Forms">
<forms loginUrl="Login.aspx" />
</authentication>
При попытке просмотра защищенной страницы ASP.NET проверяет, есть ли аутентификационных cookie в запросе. Если cookie нет, то запрос перенаправляется на страницу для регистрации, если есть - ASP.NET дешифрует cookie и извлекает из него регистрационную информацию.
На форме находятся поля для ввода логина и пароля и флажок для сохраняемой регистрации. При нажатии кнопки "Войти" происходит поиск пользователя с таким логином и паролем. Если такой пользователь найден, вызывается функция FormsAuthentication.RedirectFromLoginPage (), в которой указывается идентификатор пользователя и флаг для сохраняемой регистрации. Если же нет - выводится сообщение об ошибке.protected void btnLogin_Click(object sender, System.EventArgs e)
{
if (!IsValid) // проверяем правильность введенных данных
return;
OleDbConnection connection = GetDbConnection();
try
{
connection.Open();
OleDbCommand command = new OleDbCommand(string.Format("SELECT id FROM Customers WHERE login='{0}' AND password='{1}'", login, password), connection);
OleDbDataReader reader = command.ExecuteReader();
if (!reader.Read()) // пароль или логин неверны
{
lblError.Text = "Неверный пароль - попробуйте еще раз";
return ;
}
string id = return reader.GetInt32(0).ToString();
FormsAuthentication.RedirectFromLoginPage(id, chkbRememberLogin.Checked);
}
catch (OleDbException ex)
{
lblError.Text = "Ошибка базы данных";
}
finally
{
connection.Close();
}
}
Аутентификации на основе ролей
Для аутентификации на основе ролей применяется атрибут roles тега allow. Например, если мы хотим запретить доступ всем, кроме пользователей из группы Admin , мы должны вставить такие строки в файл Web.config.
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpApplication appl = (HttpApplication)sender;
if (appl.Request.IsAuthenticated && appl.User.Identity is FormsIdentity)
{
FormsIdentity identity = (FormsIdentity)appl.User.Identity;
DataTable tblUsers = (DataTable)Application["UsersTable"];
appl.Context.User = new GenericPrincipal(identity,
new string[] {(string)(tblUsers.Rows.Find(identity.Name)["Role"]) } );
}
}
В коде проверяется тип аутентификации пользователя и то, что он уже зарегистрирован. Имя пользователя извлекается из cookie свойством Name. Таблица с именами пользователей и их ролями для повышения быстродействия была сохранена в объекте Application. Из этой таблицы и находим роль пользователя, которую сохраняем в объекте GenericPrincipal.
Параметры аутентификации
Если второй параметр функции RedirectFromLoginPage () равен false , то время жизни сеансового cookie , генерируемого ASP.NET , равно по умолчанию 30 минутам. Для изменения этого интервала служит параметр timeout тега forms в файле Web.config. Установим время действия аутентификации в 3 часа.
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="180" />
</ authentication >
Можно указать имя аутентификационных cookie , поместив его в атрибут name (имя по умолчанию - ASPXAUTH ):
<authentication mode="Forms">
<forms loginUrl="Login.aspx" name="MY_SITE_AUTH" />
</ authentication>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" protection="None" />
</ authentication >
Сброс forms-аутентификации
Сброс регистрации можно увидеть на многих сайтах. Для сброса аутентификации применяется метод FormsAuthentication.SignOut (). Он устанавливает дату окончания действия cookie на прошедшее время и cookie автоматически уничтожается.Аутентификация Passport
При аутентификации Passport пользователи могут входить на разные web -сайты пользуясь единым удостоверением службы Microsoft Passport. Это освобождает пользователя от регистрации на каждом сайте, а сами сайты получают сведения о пользователе из профиля, хранимого Microsoft.Для использования Passport аутентификации в web -приложении нужно установить Passport SDK. Passport SDK предоставляется бесплатно для тестирования, но для коммерческого использования на сайте необходимо приобретать лицензию.
При обращении к приложению с Passport аутентификацией проверяется наличие cookie с данные Passport. Если такого файла нет, пользователь перенаправляется на страницу для регистрации Passport.
Для включения данного режима аутентификации в файле Web. config нужно указать следующее:
<authentication mode= "Passport" />
Для обязательной регистрации всех посетителей сайта в разделе autorization нужно запретить доступ неавторизированным пользователем:<authorization>
<deny users="?" />
</authorization>
protected void PassportAuthentication_OnAuthenticate(Object sender, PassportAuthenticationEventArgs e)
{
System.Web.Security.PassportIdentity id = e.Identity;
if(id.IsAuthenticated)
{
Session["PassportID"] = e.Identity.Name;
Session["Name"] = e.Identity["FirstName"] + e.Identity["LastName":];
Session["Email"] = e.Identity["PrefferedEmail"];
}
}
Кондратьев Денис