在HttpClient中设置授权标头是否安全?

Cod*_*ern 0 c# asp.net http

我正在一个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");
    }
}
Run Code Online (Sandbox Code Playgroud)

是否在HttpClient线程安全上以这种方式设置标头?假设此HttpClient仅存在一个实例,其他用户是否将有一种访问该令牌的方式?

编辑:

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

Kir*_*kin 6

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

一种避免这种情况的选择是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))
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,标头是在每个请求上专门设置的,因此混淆了标头。明显的缺点是此语法更冗长。