在 Blazor WebAssembly 应用程序中将 JWT 放在请求头部的解决方法如下所示:
JwtInterceptor.cs
的新类,用于拦截每个请求,并在请求头部添加 JWT。using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
public class JwtInterceptor : DelegatingHandler
{
private readonly NavigationManager _navigationManager;
public JwtInterceptor(NavigationManager navigationManager)
{
_navigationManager = navigationManager;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await GetTokenAsync();
if (!string.IsNullOrEmpty(token))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
return await base.SendAsync(request, cancellationToken);
}
private async Task GetTokenAsync()
{
// 从 localStorage 或其他地方获取 JWT Token
var token = await // 获取 Token 的逻辑
return token;
}
}
Program.cs
中注册 JwtInterceptor
类作为 HttpClient
的拦截器。using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add("app");
// 注册 JwtInterceptor 类
builder.Services.AddScoped();
// 注册 HttpClient,并设置其拦截器为 JwtInterceptor
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }
.AddHttpMessageHandler());
await builder.Build().RunAsync();
}
}
通过上述代码,每次发送 HTTP 请求时,JwtInterceptor
类都会拦截请求并在请求头部添加 JWT。