web-dev-qa-db-ja.com

httpClientHandlerを追加するBlazorは、要求にhttpヘッダーにJWTを追加する

標準の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.ClientStartup.csに次のものを追加するかのようなことがわかりません。

services.AddTransient<JwtTokenHeaderHandler>();
services.AddHttpClient("JwtTokenHandler")
    .AddHttpMessageHandler<JwtTokenHeaderHandler>();

エラーメッセージが表示されます。

'iserviceCollection'に 'addhttpclient'の定義は含まれていません。

誰かが私がここで間違っていることを私に指示することができますか?

5
Matthew Flynn

AddHTTPClientメソッドを含むNUGETパッケージMicrosoft.Extensions.Httpが必要です。次のコマンドでインストールします。Install-Package Microsoft.Extensions.Http -Version 3.0.0-preview7.19362.4

そのようなように、このNUGETパッケージはサーバーサイドブレゾーに自動的に提供されますが、クライアントサイドのブレゾーに別々にインストールする必要があります。

0
Pascal R.

これを実証する本当に良いチュートリアルとサンプルを見つけました(役割/ポリシーベースのクレームを備えています): 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")));
    }
    // ...
}
 _
0
Obliterator