ZetCode

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。

Program.cs
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。

Controllers/UserController.cs
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 等各种方法有助于检索声明。

来源

Microsoft ASP.NET Claims 文档

在本文中,我们探讨了 ASP.NET 8 中的 ClaimsPrincipal 类。这个强大的功能对于实现身份验证和授权至关重要。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程