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

Базовые понятия систем безопасности

Существуют два понятия, без которых невозможно обсуждение безопасности:

  • Аутентификация (authentication) – процесс определения личности пользователя, требующий верные логин и пароль, чтобы доказать, что он на самом деле тот, за кого себя выдает.
  • Авторизация (authorization) – это процесс выставления прав пользователю, прошедшего аутентификацию. 

Способы аутентификации ASP.NET

Среда ASP.NET предоставляет три способа аутентификации:

  • Windows – аутентификация на основе системы диспетчера локальной сети Windows
    NT.
  • Forms – аутентификация на основе cookies.
  • Passport – аутентификация с помощью службы Passport от
    Microsoft.

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

<configuration>
<system.web>
<!--другие настройки пропущены -->
<authentication mode=”Forms” />
</system.web>
</configuration>

Правила авторизации

Вы можете справедливо заметить, что после внесения показанных выше изменений ничего особенного не происходит.
Эта ситуация возникает из-за того, что мы не запретили доступ анонимным пользователям. Для
такого запрета надо внести еще одно изменение в файле
web.config:

<configuration>
<system.web>
<!--другие настройки пропущены -->
<authorization>
<deny users=”?” />
</authorization>
</system.web>
</configuration>

Этот знак - (?) - обозначает всех анонимных пользователей. А включая это правило вы запрещаете им доступ. Теперь каждый пользователь должен быть аутентифицирован, и каждый
не аутентифицированный будет перенаправлен на страницу регистрации.

Страница регистрации 

После того, как вы выбрали режим аутентификации и правила авторизации, вам нужно создать страницу, которая запрашивает информацию у пользователя и решает, можно ли его аутентифицировать. Но об этом чуть позже. А пока я поясню, как мы это будем делать. Пароли и логины мы будем хранить,
например, в файле web.config. Пример того, как это сделать показан ниже:

<configuration>
<system.web>
<!--другие настройки пропущены -->
<authentication mode=”Forms” loginUrl=”login.aspx”>
<credentials passwordFormat=”Clear”>
<user name=”vasya” password=”pupkin” />
</credentials>
</forms>
</system.web>
</configuration>

Небольшие пояснения: параметр loginUrl в теге authentication указывает на страницу регистрации (по умолчанию – default.aspx), а параметр passwordFormat в теге credentials означает, что логин и пароль не зашифрованы (альтернативы – использовать алгоритмы шифрования SHA1 и MD5. О них мы поговорим позже ).

Для проверки верности логина и пароля будем использовать метод
FormsAuthentication. Authenticate(string login,string pass). А для регистрации пользователя в приложение ASP.NET путем создания cookie, и перенаправления на страницу, которая была изначально запрошена пользователем, будем использовать метод
FormsAuthentication. RedirectFromLoginPage(string login, bool CreatePersistentCookie) (второй параметр указывает на то,
каким будет посланный cookie – постоянный (срок годности
- 50 лет, значение true) или нет (false)).

Вот, собственно, и сам код страницы регистрации:

<%@ Page Language="C#" %
<script runat="server">
//
событие, происходящее по нажатию кнопки
void LoginBtn_Click(Object sender, EventArgs e) {
//
если логин и пароль верны, то перенаправляем на запрашиваемую страницу… 
if (FormsAuthentication.Authenticate( UserName.Text,UserPass.Text)) {
FormsAuthentication.RedirectFromLoginPage( UserName.Text, false);
}
else {
//
иначе выводим текст с ошибкой
Msg.Text = "Неправильные данные: попробуйте повторить попытку";
}
}
}
</script>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form runat="server">
Логин: <asp:TextBox id="UserName" runat="server"></asp:TextBox>
<br>
Пароль: <asp:TextBox id="UserPass" runat="server" TextMode="Password"></asp:TextBox>
<br>
<asp:button id="LoginBtn" onclick="LoginBtn_Click" runat="server" text="Пуск!"></asp:button>
<asp:Label id="Msg" runat="server" forecolor="red"></asp:Label>
</form>
</body>
</html>

Защита паролей с помощью шифрования

В предыдущем примере список логинов и паролей хранился в свободном формате, а это сам
понимаешь к чему приводит (это не связано с серьезным риском, т.к. запросы на файлы config автоматом отклоняются, но все же приводит к потенциальной уязвимости системы). Решением этой проблемы стало использование хешированных значений пароля. Чтобы добавить в файл web.config хешированный пароль нужно использовать метод
HashPasswordForStroringInConfigFile( string pass, string algorithm) класса FormsAuthentication (algorithm принимает значения либо “SHA1”,
либо “MD5”), и в теге passwordFormat выставить нужное значение.

Bonus track

Сейчас я приведу код, который ты сможешь использовать уже в скором будущем (если начнешь учить ASP.NET). Этот код проверяет указанный в форме логии и пароль в таблице БД Access или SQL Server (для SQL Server надо заменить строку подключения coon_str и заменить префикс OleDb на Sql).

void LoginBtn_Click(Object sender, EventArgs e) { 
string conn_str = "PROVIDER=MICROSOFT.JET. OLEDB.4.0;DATA SOURCE="
+Server.MapPath("users.mdb");
string sqlselect=”SELECT Name, Password FROM users Where Name =’”+txtUserName.Text +”’ AND Password=’”+txtPassword.text+”’”
//
создаем объекты ADO.NET
OleDbConnection conn = new OleDbConnection(conn_str)
try 

conn.Open();
OleDbCommand cmd = new OleDbCommand(sqlselect, conn);
OleDbDataReader reader=cmd.ExecuteReader();
reader.Read();
if (txtPassword.Text==reader[“Password]||txtUserName.Text==reader[“Name”])
FormsAuthentication.RedirectFromLoginPage(txtUserName.Text,false)
reader.Close();
}
catch (Exception err)
{
Response.Write(err.Message);
}
finally
{
conn.Close();
}
}

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии