首先配置JWT身份验证并添加认证授权中间件,然后生成令牌供登录使用,接着通过[Authorize]特性实现角色或策略授权,最后前端请求携带Bearer令牌完成安全调用。

在构建 .NET Web API 时,实现身份验证和授权是保障接口安全的关键步骤。现代 .NET(如 .NET 6 及以上版本)推荐使用基于 JWT 的身份验证机制,并结合策略或角色进行授权控制。下面介绍如何一步步实现。
启用 JWT 身份验证
JWT(JSON Web Token)是一种无状态的身份验证方式,适合分布式系统。你需要配置服务端生成并验证令牌。
1. 安装所需 NuGet 包(通常已包含在项目中):
Microsoft.AspNetCore.Authentication.JwtBearer
2. 在 Program.cs 中添加 JWT 验证服务:
var builder = WebApplication.CreateBuilder(args);
// 添加认证服务
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
// 启用认证和授权中间件
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
3. 在 appsettings.json 中配置 JWT 参数:
"Jwt": {
"Key": "your-very-secret-key-that-is-long-enough",
"Issuer": "https://localhost:5001",
"Audience": "https://localhost:5001"
}
生成登录令牌
创建一个登录接口,在用户凭据正确时返回 JWT 令牌。
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
// 示例:验证用户名密码(实际应查数据库)
if (model.Username == "admin" && model.Password == "password")
{
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, model.Username),
new Claim(ClaimTypes.Role, "Admin")
}),
Expires = DateTime.UtcNow.AddHours(1),
Issuer = Configuration["Jwt:Issuer"],
Audience = Configuration["Jwt:Audience"],
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])),
SecurityAlgorithms.HmacSha256)
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
var jwtToken = tokenHandler.WriteToken(token);
return Ok(new { token = jwtToken });
}
return Unauthorized();
}
使用授权控制访问
在控制器或方法上使用 [Authorize] 特性限制访问。
例如,只允许通过身份验证的用户访问:
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
[HttpGet("data")]
public IActionResult GetData()
{
return Ok(new { message = "这是受保护的数据", user = User.Identity.Name });
}
}
按角色授权:
[Authorize(Roles = "Admin")]
[HttpGet("admin-only")]
public IActionResult AdminOnly()
自定义策略授权(需提前注册策略):
// 在 Program.cs 中添加策略
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("MustBeAdminOrManager", policy =>
policy.RequireRole("Admin", "Manager"));
});
// 使用
[Authorize(Policy = "MustBeAdminOrManager")]
前端请求携带令牌
客户端在调用受保护的 API 时,需在请求头中包含 Authorization 字段:
Authorization: Bearer <your-jwt-token>
例如使用 JavaScript fetch:
fetch("/api/secure/data", {
headers: {
'Authorization': 'Bearer ' + token
}
})
基本上就这些。只要配置好 JWT 验证、生成令牌、并在需要的地方加上授权标签,你的 Web API 就具备了基本的安全控制能力。注意密钥保管和 HTTPS 使用,避免敏感信息泄露。
以上就是.NET Web API如何实现身份验证和授权的详细内容,更多请关注php中文网其它相关文章!