Ответ 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();
Для получения дополнительной информации см. следующие ссылки:
- http://msdn.microsoft.com/en-us/library/system.string.substring(v=vs.110).aspx
- http://msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspx
Декодирование 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.");
}