在HttpClient中设置Authorization头是否安全?

3

我正在一个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对象进行请求时,我需要添加标头吗?
2个回答

16

根据您的方式,一旦您在静态实例上设置了默认请求头,它将保持不变,无需再次设置。这意味着,如果您的服务器收到多个请求,您可能会遇到这样一种情况:某个用户的标头被设置,然后在第一个请求完成之前被另一个请求更改。

避免这种情况的其中一个选项是,在使用特定于用户的授权标头时,使用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对象发出请求时,我是否需要添加头文件?

不需要,因为您设置了默认头文件,使用该对象创建的所有请求都将具有该头文件。

对于诸如Bearer令牌之类的内容,最好不要放在默认头文件中,而是通过创建新的 HttpRequestMessage 对象,在那里设置所需的头文件,然后使用 HttpClient.SendAsync(将请求消息传递以及发送头文件与您的请求一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接