OAuth 2.0 和 JWT 授权在 C# 中的完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

C# 中 OAuth 2.0 和 JWT 简介



现代 Web 应用程序和 API 需要可靠的授权系统。两个最流行的标准——OAuth 2.0(委托访问协议)和 JWT(JSON Web Token,令牌格式)——已成为 .NET 生态系统中安全性的基础。在本文中,我们将分析如何在 ASP.NET Core 中使用 C# 实现 OAuth 2.0 和 JWT 授权,创建一个授权服务器示例并保护 API。



无论您是在创建单体应用程序还是微服务架构,理解这些机制都至关重要。OAuth 2.0 定义了角色(客户端、授权服务器、资源服务器),而 JWT 则是一种紧凑且自包含的传递用户数据的方式。



OAuth 2.0 基础:流程和角色



什么是 OAuth 2.0?

OAuth 2.0 是一种授权协议,允许第三方应用程序在不传递用户凭据的情况下获得对用户资源的有限访问权限。它使用 访问令牌(access tokens)代替登录名和密码。



OAuth 2.0 中的主要角色

  • Resource Owner — 拥有数据的用户。
  • Client — 请求访问的应用程序。
  • Authorization Server — 在身份验证后颁发令牌的服务器。
  • Resource Server — 保护资源并验证令牌的 API。


流行的授权流程(grant types)

  • Authorization Code — 用于服务器端应用程序(最安全)。
  • Client Credentials — 用于服务器间通信(无用户参与)。
  • Implicit — 已弃用,不推荐使用。
  • Refresh Token — 用于无需重新输入密码即可获取新的 access token。


JWT(JSON Web Token):结构和原理



JWT 由什么组成?

JWT 是一个由三部分组成的字符串,各部分由点分隔:

header.payload.signature


  • Header — 令牌类型和签名算法(例如 HS256 或 RS256)。
  • Payload — 数据(claims):用户标识符、角色、过期时间等。
  • Signature — 用于验证令牌未被篡改的签名。


JWT 对 C# 的优势

  • 自包含性 — 所有用户数据都在令牌内部。
  • 在资源服务器端无需访问数据库即可轻松验证。
  • 通过 Microsoft.AspNetCore.Authentication.JwtBearer 库在 .NET 中得到支持。


在 ASP.NET Core 中使用 C# 实现 OAuth 2.0 + JWT



1. 配置授权服务器(颁发 JWT)

我们将创建一个最小的服务器,它接受登录名/密码并返回 JWT。为简单起见,我们使用对称密钥(HS256)。



// Program.cs — 授权服务器using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.IdentityModel.Tokens;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;

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 = "MyAuthServer", ValidAudience = "MyApiClient", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey123!@#$%")) }; });

builder.Services.AddAuthorization();var app = builder.Build();

app.MapPost(```

博客

书籍推荐