Заголовки исчезают при использовании 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 Плохим Запросом, если заголовок был недействительным согласно спецификации.