4 回答

TA貢獻1813條經驗 獲得超2個贊
下面是一個摘錄,在默認 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")));
? ? }
? ? // ...
}

TA貢獻1866條經驗 獲得超5個贊
目前您無法在客戶端 Blazor 上使用 IHttpClientFactory。
而且您不必從 HttpMessageHandler (DelegatingHandler) 派生。Blazor 已經做到了。以下是擴展 HttpClient 服務功能的擴展類,以啟用將 Jwt 令牌添加到請求消息標頭的功能...
服務擴展.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.DependencyInjection;
public static class ServiceExtensions
{
public static async Task<T> GetJsonAsync<T>(this HttpClient httpClient, string url, AuthenticationHeaderValue authorization)
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Authorization = authorization;
var response = await httpClient.SendAsync(request);
var responseBytes = await response.Content.ReadAsByteArrayAsync();
return JsonSerializer.Parse<T>(responseBytes, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
}
}
下面展示了如何調用 Web Api 上的端點,傳遞從 localStorage 讀取的 Jwt 令牌。(順便說一句,這些版本都沒有數據保護)
索引剃刀
@page "/"
@inject ILocalStorageService localStorage
@inject HttpClient Http
<div class="mdc-card main-content-card">
<h1 class="@MdcTypography.H4">Hello, world!</h1>
Welcome to your new app.
</div>
// Razor content to display emloyees come here.....
@code {
Employee[] employees;
protected override async Task OnInitAsync()
{
var token = await localStorage.GetTokenAsync();
employees = await Http.GetJsonAsync<Employee[]>(
"api/employees",
new AuthenticationHeaderValue("Bearer", token));
}
}
希望這有效...如果沒有,并且您無法解決錯誤,請來這里告訴社區...

TA貢獻1853條經驗 獲得超18個贊
以下將 X-CSRF-TOKEN 標頭添加到 http 請求中:
public class CustomHttpMessageHandler : DelegatingHandler
{
private readonly IJSRuntime _js;
public CustomHttpMessageHandler(IJSRuntime js)
{
_js = js;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var afrt = await _js.InvokeAsync<string>("getCookie", ".AFRT");
request.Headers.Add("X-CSRF-TOKEN", afrt);
return await base.SendAsync(request, cancellationToken);
}
}
在 Program.cs 中配置如下:
builder.Services.AddScoped<CustomHttpMessageHandler>();
builder.Services.AddHttpClient("ApiClient", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<CustomHttpMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("ApiClient"));
您需要將 Microsoft.Extensions.Http 包安裝到 Blazor WebAssembly 客戶端。

TA貢獻1810條經驗 獲得超4個贊
Microsoft.Extensions.Http
您需要包含 AddHttpClient 方法的NuGet 包。使用以下命令安裝它:Install-Package Microsoft.Extensions.Http -Version 3.0.0-preview7.19362.4
看起來,這個 NuGet 包是在服務器端 blazor 中自動提供的,但必須在客戶端 blazor 中單獨安裝。
- 4 回答
- 0 關注
- 407 瀏覽
添加回答
舉報