使用HttpSelfHostServer时标题消失

时间:2012-03-19 15:19:16

标签: wcf-web-api asp.net-web-api

我正在将相当广泛的REST服务从WCF迁移到ASP.NET WebAPI。我们使用Authorization标头将令牌从客户端发送到服务器,并且我实现了一个DelegateHandler,其代码只要看到没有有效的Authorization标头就会响应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,这里HttpRequestMessage上没有Authorization标头,即使我可以看到它是在Fiddler跟踪上发送的。

我尝试使用自托管来创建一个非常简单的WebAPI应用程序,以验证问题是否一致,但遗憾的是它在预期的情况下正常工作。所以它必须以某种方式与我的代码相关,但我对导致它的原因完全不了解。

是否有其他人看到过这种行为,或者是否有人建议如何跟踪WebAPI堆栈中哪里出错?

1 个答案:

答案 0 :(得分:1)

问题原来是由发送的Authorization标头的格式引起的。我们希望Authorization标题看起来像这样:

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

这在WCF下工作正常,但它没有根据HTTP标准格式化,HTTP标准需要一个方案和一个值。例如:

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

我的猜测是,只有标头中的值,Web API会将此视为方案,并且此处仅允许某些字符。当我添加XAPI作为方案并使用相同的值时,一切正常,并且我的代码可以在HttpRequestMessage.Headers.Authorization上使用Authorization标头。

但是我认为这是Web API中的一个错误,如果格式无效,则允许继续请求并忽略标头。如果根据规范标题无效,我希望它以400 Bad Request响应。