【问题标题】:Is setting the Authorization header in HttpClient safe?在 HttpClient 中设置 Authorization 标头是否安全?
【发布时间】:2017-11-17 05:12:39
【问题描述】:

我在 MVC5 ASP.NET 项目中工作,并了解到要从控制器向 WEB API 发送经过身份验证的请求,我可以执行以下操作以向标头添加令牌(使用示例代码):

public static class APICaller
{
    // Use a single instance for HttpClient to reduce overhead
    private static readonly HttpClient client = new HttpClient();

    //Set the Authorization Header
    public static string SetHeader( string token )
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

        return("Success");
    }
}

在 HttpClient 线程安全上以这种方式设置标头吗?鉴于此 HttpClient 只有一个实例,其他用户是否有办法访问相同的令牌?

编辑:

我想再问一个问题,以便更好地了解它的工作原理。每次使用相同的 HttpClient 对象发出请求时,是否需要添加标头?

【问题讨论】:

    标签: c# asp.net http


    【解决方案1】:

    使用您的方法,一旦您在静态实例上设置了默认请求标头,它将保持设置状态,而无需您继续设置它。这意味着,如果您有多个请求进入您的服务器,您最终可能会遇到这样一种情况,即为一个用户设置了标头,然后在第一个请求发出之前被另一个请求更改。

    避免这种情况的一种选择是在使用特定于用户的授权标头时使用SendAsync。这允许您将标头绑定到特定消息,而不是将其设置为 HttpClient 本身的默认值。

    代码有点冗长,但看​​起来像这样:

    using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://path/to/wherever"))
    {
        httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "TheToken");
    
        using (var httpResponseMessage = httpClient.SendAsync(httpRequestMessage))
        {
            // ...
        }
    }
    

    如您所见,标头是针对每个请求专门设置的,因此混淆标头的问题消失了。明显的缺点是这种语法比较冗长。

    【讨论】:

      【解决方案2】:

      如果这个 HttpClient 只有一个实例,其他用户是否有办法访问同一个令牌?

      是的,这就是为什么在设置默认标题时需要小心。

      是否需要在每次使用相同的 HttpClient 对象发出请求时添加标头?

      不,因为您设置了 default 标头,因此使用该对象创建的所有请求都将具有标头。

      对于像 Bearer 令牌这样的东西,最好不要放入默认标头,而是通过创建一个新的 HttpRequestMessage 对象将其放入请求标头中,在那里设置您需要的标头,然后使用 HttpClient.SendAsync( 传入与您的请求一起发送标头的请求消息。

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 1970-01-01
        • 2021-03-27
        • 2017-11-30
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        相关资源
        最近更新 更多