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

Blazor .NET Core项目API调用认证的优雅处理方案咨询

Blazor .NET Core项目Token认证优化方案

1. Token的安全存储

别用全局类存token——Blazor Server端会导致多用户数据串用,WebAssembly端还容易被XSS攻击窃取。正确的存储方式:

  • Blazor WebAssembly:用框架自带的ProtectedLocalStorage,把token加密后存在浏览器本地,比普通localStorage安全得多。
  • Blazor Server:用ProtectedSessionStorage或HttpContext.Session,这些存储是用户隔离的,不会跨用户共享数据。

2. 自动给API请求加Token

不用写全局中间件,用HttpClient的DelegatingHandler就能优雅实现自动注入token,彻底解放服务层代码:

  1. 自定义消息处理器,从安全存储取token并添加到请求头:
public class TokenAuthorizationHandler : DelegatingHandler
{
    private readonly ProtectedLocalStorage _protectedStorage;

    public TokenAuthorizationHandler(ProtectedLocalStorage protectedStorage)
    {
        _protectedStorage = protectedStorage;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var tokenResult = await _protectedStorage.GetAsync<string>("access_token");
        if (tokenResult.Success && !string.IsNullOrWhiteSpace(tokenResult.Value))
        {
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.Value);
        }

        return await base.SendAsync(request, cancellationToken);
    }
}
  1. 把处理器注册到DI,并绑定到API请求的HttpClient:
// Program.cs
builder.Services.AddScoped<TokenAuthorizationHandler>();
builder.Services.AddHttpClient<IApiDataService, ApiDataService>(client =>
{
    client.BaseAddress = new Uri(builder.Configuration["ApiSettings:BaseUrl"]);
}).AddHttpMessageHandler<TokenAuthorizationHandler>();

这样所有通过该HttpClient发起的API请求,都会自动带上token,服务层完全不用关心token的传递逻辑。

3. 绝对不要存储用户名密码

登录流程只需要一次提交用户名密码到API的token端点,拿到token后立刻丢弃密码,绝不落地存储。如果担心token过期需要重新登录,可让API返回refresh token:

  • refresh token同样存在加密存储中,有效期比access token长(比如7天)
  • 当access token过期返回401时,用refresh token调用API的刷新端点获取新的access token,全程无需用户再次输入密码
  • refresh token要和access token分开存储,避免同时泄露

4. 用户权限差异的处理

如果API返回的是JWT token,可直接从token的payload里解析出用户角色、权限列表,存在加密存储或Scoped服务中:

// 解析JWT获取用户权限
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(accessToken);
var userRoles = jwtToken.Claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).ToList();
await _protectedStorage.SetAsync("user_roles", userRoles);

之后在Blazor页面中用AuthorizeView组件控制UI显示,或在服务层做权限校验:

<AuthorizeView Roles="Admin">
    <p>仅管理员可见内容</p>
</AuthorizeView>

5. 额外安全防护

  • 强制所有请求走HTTPS,防止token在传输过程中被窃听
  • 给access token设置短有效期(比如15分钟),降低泄露后的风险
  • 保持Blazor默认的XSS防护开启,不要直接渲染未过滤的用户输入HTML,避免恶意脚本窃取存储的token
  • Blazor Server端禁止用静态类存储用户相关数据,全部使用Scoped服务或HttpContext,保证用户数据隔离

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:35:16