Заголовки исчезают при использовании HttpSelfHostServer

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

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 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам