Базовая HTTP аутентификация

В данной заметке опишу как поднять базовую http авторизацию на своем сайте.

Для начала вкратце опишу как работает механизм авторизации

  1. клиент запрашивает запрещенный ресурс
  2. сервер отдает страницу со статусом 401 и c заголовком WWW-Authenticate», «Basic realm=»My Realm»
  3. клиент смотрит на этот заголовок и предлагает пользователю ввести логин и пароль. Страницу 401 еще не отображается, пользователь видит белый экран.
  4. пользователь может нажать Отмена, после чего он увидит страницу 401 или ввести свой логин и пароль, после чего клиент снова делает запрос на сервер, отправляя заголовок Authorization: Basic QWRtaW46MTIzNDU2. Строка QWRtaW46MTIzNDU2 — это конкатенация логина и пароля в base64 кодировке, в данном случае ‘Admin:123456′.
  5. сервер проверяет подлинность логина и пароля, и отдает запрошенную страничку в случае успеха. А в случае неудачи все повторяется с п 2.

Вот собственно код контроллера:

public class HttpAuthController : Controller
    private bool AllowAccess()
    {
        bool allow = true;
        if (String.IsNullOrEmpty(Request.Headers["Authorization"]))
            allow = false;
        else
        {
            // проверяем логин и пароль
            var cred = System.Text.UTF8Encoding.UTF8
 .GetString(Convert.FromBase64String(Request.Headers["Authorization"].Substring(6)))
.Split(':');
            string userName = cred[0];
            string password = cred[1];
            // здесь должна быть сама проверка(запрос в бд к примеру)
            if (!userName.Equals("Admin") || !password.Equals("123456"))
                allow = false;
        }
    // предложим пользователю авторизоваться, в случае если он откажется то покажем ему страницу 401
        if(!allow)
        {
            Response.AppendHeader("WWW-Authenticate", "Basic realm=\"My Realm\"");
            Response.StatusCode = 401;
            Response.Write("Страница 401 - требуется авторизация.");
            Response.End();
        }
        return allow;
    }
    public string PrivateInfo()
    {
        if (!AllowAccess())
            return null;
        return "Вы прошли проверку, теперь Вы наш человек!";
    }
}

Как видно в контроллере PrivateInfo вызывается метод AllowAcces(). Данный метод выполняет всю работу — отдает страницу 401 с заголовком, парсит заголовок Authorization, делает проверку и возвращает true если проверка пройдена успешно. Данный метод нужно будет вызывать во всех контроллерах, к которым ограничен доступ.
Ссылки:

Базовая HTTP аутентификация: Один комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>