Подтвердить что ты не робот

Как я могу получить учетные данные базовой аутентификации из заголовка?

Я пытаюсь написать несколько простых тестов: механизм аутентификации пользователя, который использует базовую аутентификацию. Как получить учетные данные из заголовка?

string authorizationHeader = this.HttpContext.Request.Headers["Authorization"];

Куда мне идти дальше? Есть несколько учебников, но я новичок в .NET и аутентификации, не могли бы вы объяснить в своем ответе точно пошаговое, что и почему вы делаете.

4b9b3361

Ответ 1

Из моего блога:

Это подробно объяснит, как все это работает:

Шаг 1 - Понимание базовой проверки подлинности

Всякий раз, когда вы используете базовую проверку подлинности, заголовок добавляется в HTTP-запрос, и он будет выглядеть примерно так:

Авторизация: Основной QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

Источник: http://en.wikipedia.org/wiki/Basic_access_authentication

"QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" - это просто "имя пользователя: пароль", закодированное в Base64 (http://en.wikipedia.org/wiki/Base64). Чтобы получить доступ к заголовкам и другим свойствам HTTP в .NET(С#), вам необходимо иметь доступ к текущему Контексту Http:

HttpContext httpContext = HttpContext.Current;

Это можно найти в пространстве имен System.Web.

Шаг 2 - Получение заголовка

Заголовок полномочий не является единственным в HttpContext. Чтобы получить доступ к заголовку, нам нужно получить его из запроса.

string authHeader = this.httpContext.Request.Headers["Authorization"];

Если вы отлаживаете код, вы увидите, что содержимое этого заголовка выглядит примерно так:

Базовый QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

Шаг 3 - Проверка заголовка

Вы уже извлекли заголовок, теперь вам нужно сделать несколько вещей:

  • Убедитесь, что заголовок не является нулевым.
  • Убедитесь, что механизм авторизации/аутентификации действительно является "основным"

Так же:

if (authHeader != null && authHeader.StartsWith("Basic")) {
    //Extract credentials
} else {
    //Handle what happens if that isn't the case
    throw new Exception("The authorization header is either empty or isn't Basic.");
}

Теперь у вас есть проверка, что у вас есть возможность извлечь данные из.

Шаг 4 - Извлечение учетных данных

Удаление "основной" подстроки

Теперь вы можете попытаться получить значения для имени пользователя и пароля. Во-первых, вам нужно избавиться от подстроки "Basic". Вы можете сделать это так:

string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();

Для получения дополнительной информации см. следующие ссылки:

Декодирование Base64

Теперь нам нужно декодировать обратно из Base64 в строку:

//the coding should be iso or you could use ASCII and UTF-8 decoder
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));

Теперь имя пользователя и пароль будут в этом формате:

username:password

Разделение имени пользователя: пароль

Чтобы получить имя пользователя и пароль, мы можем просто получить индекс ":"

int seperatorIndex = usernamePassword.IndexOf(':');

username = usernamePassword.Substring(0, seperatorIndex);
password = usernamePassword.Substring(seperatorIndex + 1);

Теперь вы можете использовать эти данные для тестирования. Удачи!

PS: окончательный код может выглядеть так:

HttpContext httpContext = HttpContext.Current;

string authHeader = this.httpContext.Request.Headers["Authorization"];

if (authHeader != null && authHeader.StartsWith("Basic")) {
    string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
    Encoding encoding = Encoding.GetEncoding("iso-8859-1");
    string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));

    int seperatorIndex = usernamePassword.IndexOf(':');

    var username = usernamePassword.Substring(0, seperatorIndex);
    var password = usernamePassword.Substring(seperatorIndex + 1);
} else {
    //Handle what happens if that isn't the case
    throw new Exception("The authorization header is either empty or isn't Basic.");
}

Ответ 2

Удивительный ответ от @DawidO.

Если вы просто хотите извлечь базовые авторизационные кредиты и полагаться на магию .NET, учитывая, что у вас есть HttpContext, это также будет работать:

  public static void StartListener() {
    using (var hl = new HttpListener()) {
      hl.Prefixes.Add("http://+:8008/");
      hl.AuthenticationSchemes = AuthenticationSchemes.Basic;
      hl.Start();
      Console.WriteLine("Listening...");
      while (true) {
        var hlc = hl.GetContext();

        var hlbi = (HttpListenerBasicIdentity)hlc.User.Identity;
        Console.WriteLine(hlbi.Name);
        Console.WriteLine(hlbi.Password);

        //TODO: validater user
        //TODO: take action
      }
    }
  }