ASP.NET ClaimsPrincipal
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 ClaimsPrincipal 类。该类是现代 ASP.NET 应用程序中身份验证和授权的基础。
ClaimsPrincipal 代表当前用户的安全上下文。它包含描述用户在应用程序中的身份和权限的声明。
基本定义
ClaimsPrincipal 是 ASP.NET 中用户身份的主要类。它实现了 IPrincipal 接口,并包含一个或多个 ClaimsIdentity 对象。
每个 ClaimsIdentity 代表一个具有多个声明的单一身份。声明是描述用户的键值对,例如姓名、电子邮件或角色成员资格。
在 ASP.NET Core 中,可以通过 User 属性在控制器中自动访问当前的 ClaimsPrincipal。它是在请求处理过程中由身份验证中间件填充的。
ASP.NET ClaimsPrincipal 示例
以下示例演示了如何在 ASP.NET 8 Web API 应用程序中使用 ClaimsPrincipal。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication(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"])) }; }); builder.Services.AddAuthorization(); builder.Services.AddControllers(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
这将在 ASP.NET 应用程序中设置 JWT bearer token 身份验证。身份验证中间件从 JWT token 填充 ClaimsPrincipal。
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Security.Claims; [ApiController] [Route("api/[controller]")] public class UserController : ControllerBase { [HttpGet("profile")] [Authorize] public IActionResult GetUserProfile() { var user = HttpContext.User; var userId = user.FindFirst(ClaimTypes.NameIdentifier)?.Value; var username = user.FindFirst(ClaimTypes.Name)?.Value; var email = user.FindFirst(ClaimTypes.Email)?.Value; var roles = user.FindAll(ClaimTypes.Role).Select(c => c.Value); return Ok(new { UserId = userId, Username = username, Email = email, Roles = roles }); } [HttpGet("admin")] [Authorize(Roles = "Admin")] public IActionResult AdminOnly() { return Ok("Welcome, Admin!"); } [HttpGet("custom-claim")] [Authorize] public IActionResult GetCustomClaim() { var department = User.FindFirst("Department")?.Value; if (string.IsNullOrEmpty(department)) { return BadRequest("Department claim is missing"); } return Ok($"User belongs to {department} department"); } }
此控制器演示了使用 ClaimsPrincipal 的三种不同方法。第一种方法从已通过身份验证的用户检索标准声明。
第二种方法使用 [Authorize] 属性展示基于角色的授权。只有具有 Admin 角色的用户才能访问此终结点。
第三种方法演示了访问自定义声明 (Department)。声明可以扩展到标准声明类型之外,以包含应用程序特定的数据。
User 属性 (HttpContext.User) 提供了对当前 ClaimsPrincipal 的访问。FindFirst 和 FindAll 等各种方法有助于检索声明。
来源
在本文中,我们探讨了 ASP.NET 8 中的 ClaimsPrincipal 类。这个强大的功能对于实现身份验证和授权至关重要。