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 类。这个强大的功能对于实现身份验证和授权至关重要。