wcf-web-api - 使用 HttpSelfHostServer 时 header 消失

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

我正在将相当广泛的 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/

相关文章:

asp.net-web-api - 通过 Swagger 将 XML 字符串发布到 WebAPI

c# - 如何启用 .Net web-API 以接受 g-ziped 帖子

asp.net-web-api - MVC 核心 ZipArchive 无效

wcf-web-api - 如何在 Windows 服务中托管 Web API

c# - 将当前身份验证凭据从 UWP 应用程序传递到 Web 服务,以使用这些凭据访问服务器上的资源

html - 如何从 WCF WebAPI WebGet 返回原始 html

.net - 从 HttpResponseMessage 中提取内容

wcf-web-api - CaSTLe.ActiveRecord.dll 与 ASP.NET MVC 4 Web API 不兼容

c# - 微服务架构中的 ASP.NET 标识

c# - autofac 是否支持新的 Web Api 2