我有兩個專案:一個 Web API 專案和一個客戶端專案。
在客戶端應用程式中,我HttpClient是這樣配置的。
services.AddHttpClient<TrackAndTraceClient>()
.ConfigureHttpClient(httpClient =>
{
httpClient.BaseAddress = new Uri(settings.BaseUrl);
httpClient.Timeout = TimeSpan.FromMinutes(5);
})
.ConfigurePrimaryHttpMessageHandler(serviceProvider =>
{
return new HttpClientHandler()
{
Credentials = new NetworkCredential(settings.Username, settings.Password),
};
});
然后在我呼叫 API 的類中:
public TrackAndTraceClient(IHttpClientFactory httpClientFactory, IOptions<TrackAndTraceSettings> settings)
{
HttpClient = httpClientFactory.CreateClient(nameof(TrackAndTraceClient));
Settings = settings.Value;
}
我的 Web API 站點使用本文中描述的技術實作基本身份驗證。但是我的代碼拋出例外,因為沒有找到Authorization標頭。
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// ...
if (!Request.Headers.TryGetValue("Authorization", out StringValues authHeaderValues))
throw new Exception("Missing Authorization header");
// ...
}
}
我只能通過將以下代碼添加到呼叫 API 的類來使其作業:
HttpClient.DefaultRequestHeaders.Add("ContentType", "application/json");
byte[] credentialsData = Encoding.UTF8.GetBytes($"{Settings.Username}:{Settings.Password}");
string credentials = Convert.ToBase64String(credentialsData);
HttpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {credentials}");
誰能告訴我為什么需要最后一段代碼?為什么設定憑據NetworkCredential似乎沒有做任何事情?以及如何更改我的 Web API 以使其與以原始方式指定的憑據一起使用?
請注意,我還呼叫了第三方 API,并且客戶端的配置方式與我在第一個代碼塊中的配置方式完全相同。所以我知道這可以發揮作用。
uj5u.com熱心網友回復:
從我們在評論部分的對話中——
您的實作BasicAuthenticationHandler缺少添加WWW-Authenticate HTTP標題(帶有 value Basic)。
這是當它接收到回應時HttpClient反應以包含Authorization HTTP標頭的標頭401 Unauthorized。
要解決此問題,請將以下行添加到BasicAuthenticationHandler.
Response.Headers.Add("WWW-Authenticate", "Basic");
現在NetworkCredentials將進入Authorization HTTP標題。
簡而言之,沒有完整地了解這是如何作業的;
當 aHttpClient發出請求(不帶Authorization標頭)并收到401 Unauthorized與WWW-Authenticate HTTP標頭組合的回應時,它將使用標頭中配置的憑據(如果有)進行第二次嘗試Authorization HTTP。
為簡單起見,您可能希望立即包含Authorization,而不依賴于NetworkCredentials和WWW-Authenticate HTTP標題。
services.AddHttpClient<TrackAndTraceClient>()
.ConfigureHttpClient(httpClient =>
{
httpClient.BaseAddress = new Uri(settings.BaseUrl);
httpClient.Timeout = TimeSpan.FromMinutes(5);
// Add below to your existing code.
var digest = Convert.ToBase64String(
Encoding.UTF8.GetBytes($"{settings.Username}:{settings.Password}")
);
httpClient.DefaultRequestHeaders.Add("Authorization", $"Basic {digest}");
HttpClient.DefaultRequestHeaders.Add("ContentType", "application/json");
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373188.html
標籤:C# 网站 验证 asp.net-web-api .net-6.0
