7.3 认证、授权与 CORS
认证回答“你是谁”,授权回答“你能做什么”,CORS 回答“浏览器是否允许这个前端访问这个后端”。三者经常一起出现,但解决的问题不同。
学习目标
- 能区分认证和授权。
- 能解释 Cookie 与 JWT 的基本取舍。
- 能配置 ASP.NET Core CORS 策略。
- 能设计前端登录态和 API 调用错误处理。
应用场景
- 用户登录后查看自己的任务。
- 管理员可以查看所有用户任务。
- React 开发服务器调用本地 ASP.NET Core API。
- Token 过期后前端需要重新登录或刷新令牌。
核心概念
| 概念 | 说明 |
|---|---|
| Authentication | 验证用户身份 |
| Authorization | 判断用户是否有权限 |
| Claim | 描述用户身份或权限的信息 |
| CORS | 浏览器跨域访问控制机制 |
CORS 配置示例
builder.Services.AddCors(options =>
{
options.AddPolicy("Frontend", policy =>
{
policy
.WithOrigins("http://localhost:5173")
.AllowAnyHeader()
.AllowAnyMethod();
});
});
var app = builder.Build();
app.UseCors("Frontend");
app.UseAuthentication();
app.UseAuthorization();
授权示例
app.MapGet("/me/todos", async (
ClaimsPrincipal user,
TodoService service,
CancellationToken cancellationToken) =>
{
var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
if (userId is null)
{
return Results.Unauthorized();
}
var todos = await service.GetTodosForUserAsync(userId, cancellationToken);
return Results.Ok(todos);
}).RequireAuthorization();
重点难点
- CORS 是浏览器安全机制,不是后端认证机制。
- 允许
*源和携带凭据通常不能同时安全使用。 - 权限校验必须在后端执行,前端隐藏按钮只是体验优化。
- Token、Cookie 和刷新机制要考虑 XSS、CSRF 和过期策略。
常见误区
| 误区 | 推荐做法 |
|---|---|
| CORS 报错就关闭所有限制 | 明确允许的前端源、方法和 Header |
| 只在前端判断管理员权限 | 后端 API 必须再次授权 |
| 把用户 ID 从请求体传入 | 从认证上下文读取当前用户 |
练习
- 为本地 React 开发服务器配置 CORS。
- 给任务列表接口增加
RequireAuthorization()。 - 设计 401 和 403 在前端的不同展示逻辑。