繁体   English   中英

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

[英]Is setting the Authorization header in HttpClient safe?

我正在一个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对象发出请求时,都需要添加标头吗?

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

一种避免这种情况的选择是在使用特定于用户的授权标头时使用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))
    {
        // ...
    }
}

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

假设此HttpClient仅存在一个实例,其他用户是否将有一种访问该令牌的方式?

是的,这就是设置默认标题时需要谨慎的原因。

每次使用相同的HttpClient对象发出请求时,都需要添加标头吗?

否,因为您设置了默认标头,所以使用该对象创建的所有请求都将具有标头。

对于Bearer令牌之类的事情,最好不要放入默认标头中,而是通过创建一个新的HttpRequestMessage对象,在其中设置所需的标头,然后使用HttpClient.SendAsync(将请求消息传递到将标头与您的请求一起发送。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM