[英]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.