You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 Blazor交互式WASM的HttpClient与Identity配置问题

解决方案:Blazor WASM + 独立API + 通用HTTP通信(含认证授权)

1. 后端HttpClient配置复用与前端适配

你后端注册的命名HttpClient可通过配置类将BaseAddress等参数暴露给前端,避免硬编码:

  • 后端appsettings.json添加API配置:
"ApiSettings": {
  "BaseAddress": "https://your-api-domain.com/"
}
  • 后端注册配置类:
builder.Services.Configure<ApiSettings>(builder.Configuration.GetSection("ApiSettings"));
  • 前端WASM可通过后端配置端点或静态文件获取这些参数(同域部署时可直接读取后端配置)。

若必须由后端控制HttpClient注册逻辑,前端可通过自定义HttpClient工厂复用配置规则,无需在前端Program.cs直接调用AddHttpClient:

// 前端WASM自定义HttpClient工厂
public class ApiHttpClientFactory : IApiHttpClientFactory
{
    private readonly HttpClient _httpClient;
    private readonly IAccessTokenProvider _tokenProvider;

    public ApiHttpClientFactory(HttpClient httpClient, IAccessTokenProvider tokenProvider, IOptions<ApiSettings> apiSettings)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri(apiSettings.Value.BaseAddress);
        _tokenProvider = tokenProvider;
        // 初始化默认请求头
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        // 绑定认证拦截器
        _httpClient.AddHttpMessageHandler(new AuthMessageHandler(_tokenProvider));
    }

    public HttpClient CreateClient() => _httpClient;
}

前端Program.cs注册该工厂:

builder.Services.AddScoped<IApiHttpClientFactory, ApiHttpClientFactory>();
builder.Services.AddOptions<ApiSettings>().Configure(options =>
{
    // 从后端配置端点获取或按需配置
    options.BaseAddress = "https://your-api-domain.com/";
});

2. 认证授权请求拦截(自动携带角色权限信息)

Blazor WASM的Identity会管理用户Access Token,实现DelegatingHandler自动将Token添加到请求头,后端可解析Token中的角色信息完成权限校验:

public class AuthMessageHandler : DelegatingHandler
{
    private readonly IAccessTokenProvider _tokenProvider;

    public AuthMessageHandler(IAccessTokenProvider tokenProvider)
    {
        _tokenProvider = tokenProvider;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var tokenResult = await _tokenProvider.RequestAccessToken();

        if (tokenResult.TryGetToken(out var token))
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Value);
        }

        return await base.SendAsync(request, cancellationToken);
    }
}

后端API需配置JWT认证(若使用Identity的JWT方案),并在接口上通过[Authorize(Roles = "Admin")]这类特性控制权限,后端会自动解析Token中的角色信息完成验证。

3. 集成Refit实现通用HTTP通信

Refit可基于自定义工厂创建的HttpClient生成API代理,无需单独注册Refit专属HttpClient:

  • 定义Refit接口:
public interface IProductApi
{
    [Get("/api/products")]
    Task<List<Product>> GetProducts();

    [Get("/api/products/{id}")]
    Task<Product> GetProduct(int id);
}
  • 前端Program.cs注册Refit服务,关联自定义工厂的HttpClient:
builder.Services.AddScoped<IProductApi>(sp =>
{
    var httpClient = sp.GetRequiredService<IApiHttpClientFactory>().CreateClient();
    return RestService.For<IProductApi>(httpClient);
});

所有Refit接口会自动使用带认证头的HttpClient,同时复用后端配置的BaseAddress。

4. .NET MAUI扩展兼容方案

将HTTP通信核心逻辑(ApiHttpClientFactory、AuthMessageHandler、Refit接口)封装到**.NET Standard类库**,WASM和MAUI项目均引用该类库:

  • MAUI中仅需替换IAccessTokenProvider为MAUI身份认证实现(如MSAL),其余逻辑完全复用。
  • MAUI的HttpClient配置与WASM一致,通过自定义工厂管理,确保请求携带认证信息。

5. 后端HttpClient注册优化

你当前的后端注册代码缺少闭合括号,修正后可添加超时、默认请求头等配置,也可注册类型化HttpClient供后端内部调用:

builder.Services.AddHttpClient("WebAPI", client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.Timeout = TimeSpan.FromSeconds(30);
});
// 后端内部调用API时可使用类型化HttpClient
builder.Services.AddHttpClient<IInternalApiClient, InternalApiClient>(client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
});

内容的提问来源于stack exchange,提问作者J S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:30:25