Спонсор: Microsoft
Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Лекция 16:

Безопасность в разработке веб - приложений

Windows аутентификация в веб - приложениях

Защита Web-приложения ASP.NET средствами аутентификации Windows состоит из нескольких этапов:

  • установить необходимые параметры в IIS (как - мы уже рассматривали);
  • настроить аутентификацию в Web.config ;
  • настроить авторизацию в web.config.

Второй пункт реализуется так: нужно открыть нужный файл web.config и вписать в раздел system.web следующую строку:

<system.web>
  <authentication mode="Windows" />
</system.web>

Дальше нужно настроить авторизацию, то есть указать, для какого файла или каталога кому будет открыт доступ. Для этой цели используется тег location:

<location path="default.aspx">
  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</location>

Если в атрибуте path будет указан каталог, то настройки распространятся на все файлы в этом каталоге и подкаталогах. Если будет указан конкретный файл (Web-форма), то настройки будут распространены только на эту Web-форму.

<deny users="?" /> означает, что запрещен доступ всем анонимным пользователям.

Чтобы разрешить доступ пользователю Mary, код может быть таким:

<authorization>
  <allow users="Alex" />
</authorization>

Если включить этот код в файл web.config для всего приложения, то параметры будут применены для всего Web-приложения.

В ASP.NET можно использовать имперсонацию. При применении имперсонации обращение к ресурсам идет с правами той учетной записи, которая прошла аутентификацию. По умолчанию имперсонация отключена, и обращение к ресурсам происходит от имени учетной записи ASPNET. Чтобы имперсонацию включить, можно использовать код вида

<identity impersonate="true|false"
          username="username"
          password="password" />

После настройки аутентификации Windows в Web-приложении при обращении к защищенной Web-странице пользователю откроется стандартное окно аутентификации, в котором пользователю необходимо ввести имя и пароль.

В коде Web-приложения вы можете получать информацию об аутентификации пользователя при помощи объекта User.Identity, например:

lblAuthUser.Text = User.Identity.Name
lblAuthType.Text = User.Identity.AuthenticationType
lblIsAuth.Text = User.Identity.IsAuthenticated

Теперь - про Forms-based аутентификацию.

При использовании этой аутентификации запрос пользователя все равно должен пройти через IIS (и, таким образом, отработать аутентификация Windows). Поэтому на уровне аутентификации Windows должен быть открыт доступ для анонимных пользователей. Далее работа выглядит так:

  1. пользователь запрашивает доступ к защищенной Web-странице
  2. сервер проверяет, включен ли в этот запрос authentification cookie. Если да, то происходит авторизация. При этом сравнивается имя пользователя, которое включено в куки, с параметрами авторизации в web.config и на основании этого принимается решение - пускать пользователя или нет.
  3. если authentification cookie не встроен в запрос, ASP.NET перенаправляет пользователя на logon page (путь к нему определяется в файле конфигурации приложения). на этой странице пользователь должен ввести имя и пароль.
  4. код приложения на logon page проверяет введенное пользователем имя и пароль, и, если оно правильно, прицепляет к его сеансу authentification cookie, и далее все идет согласно п.2. Если нет - выдается сообщение типа Access Denied.

Как все это реализовать на практике:

Вначале обеспечиваем для Web-приложения анонимную аутентификацию средствами Windows (такой режим работает по умолчанию)

Затем прописываем в файл web.config для приложения следующий код:

<system.web>
  <authentication mode="Forms">                      
    <forms name=".namesuffix" loginUrl="login.aspx" />
  </authentication>
</system.web>

То, что содержится в теге forms, относится к настройкам куки. Атрибут name - это суффикс куки, а loginURL - путь к странице аутентификации, на которую будут перенаправляться все неаутентифицировавшиеся запросы.

Далее настраивается секция авторизации в web.config (точно так же, как при аутентификации Windows).

Далее создается Web-страница logon.aspx. Это - очень простая страница, обычно с двумя полями: имя пользователя и пароль. Некоторые проблемы может вызвать только написание для нее codebehind кода. Об этом - ниже.

На codebehind странице для logon page можно использовать полностью свою логику проверки и поведения, а можно воспользоваться заранее готовым кодом ASP.NET, который реализован средствами объекта FormsAuthentification. Для него предусмотрены следующие методы:

  • Authentificate - этот метод принимает имя пользователя и пароль и проверяет его по указанному вами хранилищу имен и паролей;
  • GetAuthCookie - создает authentification cookie для указанного имени пользователя. При этом куки автоматически не выдается пользователю в рамках ответа сервера - об этом нужно позаботиться отдельно;
  • GetRedirectUrl - возвращает URL, к которому обратился неаутентифицировавшийся пользователь, прежде чем он был перенаправлен на logon page.
  • RedirectFromLoginPage - перенаправляет пользователя на тот самый URL, к которому он обращался изначально.
  • SetAuthCookie - то же, что и GetAuthCookie, но при этом куки автоматически выдается пользователю в рамках ответа сервера. Редирект на нужную страницу при этом не происходит.
  • SignOut - удаляет auth cookie с пользователя (когда пользователь производит операцию sign out).

Код самой logon page может быть очень простым, например:

<form id="Login" method="post" runat="server">
  <P>Email: 
    <asp:TextBox id="txtEmail" runat="server">
    </asp:TextBox>
  </P>
  <P>Password
    <asp:TextBox id="txtPassword" TextMode="password"
                  runat="server">
    </asp:TextBox>
  </P>
  <P>
    <asp:Button id="cmdLogin" Text="Sign In Now"
                OnClick="cmdLogin_Click" runat="server">
    </asp:Button>
  </P>
  <P>
    <asp:Label id="lblInfo" runat="server">
    </asp:Label>
  </P>
</form>

Далее мы настраиваем код обработчика событий для единственной кнопки на этой форме.

Всю проверку выполняет у нас внешняя функция login, которая, если все прошло нормально, возвращает имя пользователя (непустое значение).

Необходимо помнить, что при использовании Forms-based аутентификации информация об имени пользователя и пароле передается открытым текстом. Поэтому рекомендуется сочетать такую аутентификацию с защитой средствами SSL.

Последняя часть нашего курса - использование аутентификации средствами Microsoft Passport. Наиболее удобная возможность при использовании Microsoft Passport - то, что пользователь может помнить только одно имя пользователя/пароль для доступа на множество Web-сайтов.

При использовании аутентификации средствами Microsoft Passport ASP.NET проверяет наличие специального куки. Если его нет, пользователь перенаправляется на сайт passport.com за аутентификацией.

Passport.com выполняет аутентификацию и если она прошла успешно, на клиента прописывается authentification cookie, а клиент перенаправляется туда, откуда он пришел на passport.com. Далее, как обычно, вступают в действие настройки авторизации.

Использованные и дополнительные источники

  1. http://www.askit.ru/custom/asp_net/m16/16_security_asp_net.htm
  2. http://www.citforum.ru/security/web/
  3. http://www.nestor.minsk.by/kg/2009/02/kg90207.html
Екатерина Соколова
Екатерина Соколова
Россия, Ухта
Никита Гекторов
Никита Гекторов
Украина, Донецк