如何保护Blazor WASM调用的Bearer Token认证Minimal API项目?
浏览器环境下,要完全隐藏Bearer Token是不可能的——只要是前端发起的网络请求,开发者工具都能捕获到请求头。但我们可以通过一系列手段降低Token泄露后的风险,限制滥用,同时保证WASM正常调用API:
缩短Access Token有效期,搭配Refresh Token机制
把Access Token的有效期设得短一些(比如15-30分钟),就算Token被泄露,可用窗口也很小。同时用Refresh Token来获取新的Access Token,Refresh Token要存在HttpOnly、Secure、SameSite=Strict的Cookie里,这样浏览器JS(包括WASM)无法读取,开发者工具也看不到。
示例:Minimal API里配置JWT时设置短过期时间:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ClockSkew = TimeSpan.FromMinutes(1), // 缩短时钟偏移 ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });同时后端提供Refresh Token接口,验证Cookie里的Refresh Token后返回新的Access Token。
Access Token只存在内存中
不要把Access Token存在localStorage或sessionStorage里,这些存储可以被JS读取,也容易被XSS攻击窃取。WASM里可以用服务类的私有字段存储Token,页面刷新时再用Refresh Token重新获取,这样Token只在应用运行时存在于内存,关闭页面就消失。限制Token的权限范围(Scope)
给每个Token分配最小必要的权限,比如用户的Token只能访问自己的订单、个人资料,不能有修改其他用户数据或系统配置的权限。就算Token被盗,攻击者能做的操作也非常有限。
示例:生成Token时添加Scope声明:var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim("scope", "read:profile"), new Claim("scope", "write:own-orders") }; var token = new JwtSecurityToken( issuer: issuer, audience: audience, claims: claims, expires: DateTime.UtcNow.AddMinutes(15), signingCredentials: signingCredentials);API接口上用
[Authorize(Policy = "RequireReadProfileScope")]来验证Scope。验证请求来源
在Minimal API里添加中间件,检查请求的Origin或Referer是否是你的WASM应用域名,拒绝非信任来源的请求。虽然Origin可以被伪造,但能挡住大部分普通攻击者的直接盗用。
示例中间件:app.Use(async (context, next) => { var allowedOrigins = new[] { "https://your-wasm-app.com" }; var origin = context.Request.Headers.Origin.ToString(); if (!string.IsNullOrEmpty(origin) && !allowedOrigins.Contains(origin)) { context.Response.StatusCode = StatusCodes.Status403Forbidden; await context.Response.WriteAsync("Invalid origin"); return; } await next(); });启用API速率限制
给每个用户或Token设置请求频率限制,比如每分钟最多50次请求,就算Token被盗,攻击者也无法批量调用API造成大规模损失。可以用AspNetCoreRateLimit库来快速配置。IP绑定(高安全场景可选)
生成Token时把用户的IP地址作为Claim存入,API验证请求的IP和Token里的IP是否一致。但要注意用户可能使用动态IP,会影响正常使用,适合对安全要求极高的场景。监控异常请求
记录API的请求日志,设置告警规则——比如同一Token在短时间内从多个IP发起请求、请求频率突然飙升等,一旦检测到异常就立即失效该Token。
内容的提问来源于stack exchange,提问作者DreamingOfSleep

