Заголовки исчезают при использовании HttpSelfHostServer - PullRequest
0 голосов
/ 19 марта 2012

Я нахожусь в процессе миграции довольно обширной службы REST из WCF в ASP.NET WebAPI.Мы используем заголовок авторизации для отправки токенов с клиента на сервер, и я реализовал DelegateHandler с кодом, который отвечает 401, как только он обнаруживает, что действительный заголовок авторизации отсутствует.Упрощение кода можно увидеть здесь:

public class AuthenticationHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request == null) throw new ArgumentNullException("request");
        return !IsClientAuthorized(request)
            ? Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.Unauthorized))
            : base.SendAsync(request, cancellationToken);
    }

    private bool IsClientAuthorized(HttpRequestMessage request)
    {
        return request != null && !string.IsNullOrEmpty(request.Headers.Authorization.ToString());
    }
}

Он отлично работает при размещении в IIS, но для интеграционных тестов я использую HttpSelfHostServer, и здесь заголовок Authorization отсутствует в HttpRequestMessage, хотяЯ вижу, что это было отправлено на след Fiddler.

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

Кто-нибудь еще видел такое поведение, или у кого-нибудь есть предложения, как отследить, куда он попадает в стек WebAPI?неправильно?

1 Ответ

1 голос
/ 21 марта 2012

Проблема связана с форматом отправляемого заголовка авторизации.Мы ожидаем, что заголовок авторизации будет выглядеть примерно так:

Authorization: 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==

Это нормально работает в WCF, но не отформатировано в соответствии со стандартом HTTP, который ожидает схему и значение.Например:

Authorization: XAPI 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==

Я предполагаю, что при наличии только значения в заголовке Web API будет рассматривать это как схему, и здесь разрешены только определенные символы.Когда я добавил XAPI в качестве схемы и использовал то же значение, все работало нормально, и заголовок Authorization был доступен для моего кода на HttpRequestMessage.Headers.Authorization.

Однако я думаю, что это ошибка в Web API, чтозапрос может быть продолжен, а заголовок просто игнорируется, если он имеет неверный формат.Я ожидаю, что он ответит 400 ошибочным запросом, если заголовок был недействительным согласно спецификации.

...