我正在将相当广泛的 REST 服务从 WCF 迁移到 ASP.NET WebAPI。我们使用 Authorization header 将 token 从客户端发送到服务器,并且我使用代码实现了一个 DelegateHandler,一旦发现没有有效的 Authorization header ,该代码就会响应 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,这里授权 header 不存在于 HttpRequestMessage 上,即使我可以看到它是在 Fiddler 跟踪上发送的。
我尝试使用自托管制作一个非常简单的 WebAPI 应用程序来验证问题是否一致,但不幸的是它按预期工作。所以它一定与我的代码有某种关系,但我对导致它的原因完全空白。
是否有其他人看到过这种行为,或者是否有人对如何跟踪 WebAPI 堆栈中出现问题的位置有建议?
最佳答案
该问题是由发送的授权 header 的格式引起的。我们希望授权 header 看起来像这样:
Authorization: 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==
这在 WCF 下工作得很好,但它没有根据 HTTP 标准进行格式化,HTTP 标准需要一个方案和一个值。例如:
Authorization: XAPI 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q==
我的猜测是,只有 header 中的值,Web API 才会将此视为方案,并且此处仅允许使用某些字符。当我添加 XAPI 作为方案并使用相同的值时,一切工作正常,并且授权 header 可用于 HttpRequestMessage.Headers.Authorization 上的代码。
但是我认为这是 Web API 中的一个错误,如果格式无效,则允许请求继续进行,并且 header 将被忽略。如果根据规范 header 无效,我希望它响应 400 Bad Request。
关于wcf-web-api - 使用 HttpSelfHostServer 时 header 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9772810/