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,彻底解放服务层代码:
- 自定义消息处理器,从安全存储取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); } }
- 把处理器注册到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
相关产品推荐
相关产品推荐

