標準のBlazorクライアント、サーバー、および共有テンプレートでVisual Studio 2019
と.Net Core 3.0.0-preview-7
を使用しています。
アプリケーションでは、当社のサーバーサイドWebAPIアプリケーションは常に承認のためにヘッダーにJWTトークンが存在する必要があります。
以下を見ることから
ASP.NETコアのIHTTPClientFactoryを使用してHTTPリクエストを作成
次のハンドラを作成しました。
public class JwtTokenHeaderHandler : DelegatingHandler
{
private readonly ILocalStorageService _localStorage;
public JwtTokenHeaderHandler(ILocalStorageService localStorage)
{
_localStorage = localStorage;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (!request.Headers.Contains("bearer"))
{
var savedToken = await _localStorage.GetItemAsync<string>("authToken");
if (!string.IsNullOrWhiteSpace(savedToken))
{
request.Headers.Add("bearer", savedToken);
}
}
return await base.SendAsync(request, cancellationToken);
}
}
ここで、Blazored.LocalStorage
を使用して、保存されたトークンをLocalStorageから取得してヘッダーに追加します。
さて、この時点で私はBlazor.Client
Startup.cs
に次のものを追加するかのようなことがわかりません。
services.AddTransient<JwtTokenHeaderHandler>();
services.AddHttpClient("JwtTokenHandler")
.AddHttpMessageHandler<JwtTokenHeaderHandler>();
エラーメッセージが表示されます。
'iserviceCollection'に 'addhttpclient'の定義は含まれていません。
誰かが私がここで間違っていることを私に指示することができますか?
AddHTTPClientメソッドを含むNUGETパッケージMicrosoft.Extensions.Http
が必要です。次のコマンドでインストールします。Install-Package Microsoft.Extensions.Http -Version 3.0.0-preview7.19362.4
そのようなように、このNUGETパッケージはサーバーサイドブレゾーに自動的に提供されますが、クライアントサイドのブレゾーに別々にインストールする必要があります。
これを実証する本当に良いチュートリアルとサンプルを見つけました(役割/ポリシーベースのクレームを備えています): https://chrissainty.com/securing-your-blazor-apps-authentication-with-clienties-blazor-using- WebApi-aspnet-core-identity /
以下の抽出は、デフォルトのHTTPクライアント(DIを介した)でデフォルトの要求ヘッダーを設定します。 Web APIへのすべての通話は、ベアラトークンを含みます。
public class ApiAuthenticationStateProvider : AuthenticationStateProvider
{
private readonly HttpClient _httpClient;
private readonly ILocalStorageService _localStorage;
public ApiAuthenticationStateProvider(HttpClient httpClient, ILocalStorageService localStorage)
{
_httpClient = httpClient;
_localStorage = localStorage;
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var savedToken = await _localStorage.GetItemAsync<string>("authToken");
if (string.IsNullOrWhiteSpace(savedToken))
{
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
}
// ************** Set JWT header ****************
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", savedToken);
// *******************************************************
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(savedToken), "jwt")));
}
// ...
}
_