OneAuthCenter——一款基于 .NET打造的企业级 OAuth 2.0 / OpenID Connect 认证中心

文章目录

一、OneAuthCenter简介

OneAuthCenter 是基于 .NET 9 打造的企业级 OAuth 2.0 / OpenID Connect 认证中心,采用 DDD 分层架构,为分布式系统提供统一、安全、可扩展的身份认证与授权能力。

项目同时提供 客户端集成库(OneAuthCenter.Client),支持一行代码完成接入,自动处理 JWT 验证、Scope 校验和授权策略。

二、技术栈

  • .NET 9 - 应用框架
  • ASP.NET Core - Web API 框架
  • Entity Framework Core 9 - ORM
  • 多数据库支持 - SQL Server / MySQL / PostgreSQL / SQLite / Oracle
  • JWT Bearer Authentication - RSA 签名认证
  • BCrypt.Net - 密码哈希
  • Swashbuckle (Swagger) - API 文档

三、项目架构

本项目采用经典的四层架构设计,并提供客户端集成库:

bash 复制代码
OneAuthCenter/
├── src/                               # 源代码目录
│   ├── Extensions/                    # 🆕 扩展包源(Extensions Packages)
│   │   ├── OneAuthCenter.Client/      # 客户端集成库(可独立发布为 NuGet 包)
│   │   │   ├── Options/               # 配置选项
│   │   │   ├── Extensions/            # 扩展方法
│   │   │   └── README.md              # 客户端使用文档
│   │   └── README.md                  # 扩展包说明
│   │
│   ├── examples/                      # 🆕 集成示例项目
│   │   ├── OrdersApi/                 # 订单 API 示例
│   │   └── README.md                  # 示例使用说明
│   │
│   └── NoUI/                          # 后端项目(无UI)
│       ├── OneAuthCenter.Domain/      # 领域层
│       │   ├── Entities/              # 实体模型
│       │   │   ├── User.cs            # 用户实体
│       │   │   ├── Client.cs          # OAuth 客户端实体
│       │   │   ├── RefreshToken.cs    # 刷新令牌实体
│       │   │   ├── AuthorizationCode.cs # 授权码实体
│       │   │   ├── Scope.cs           # 作用域实体
│       │   │   └── UserConsent.cs     # 用户同意记录实体
│       │   └── Repositories/          # 仓储接口
│       │       ├── IUserRepository.cs
│       │       ├── IClientRepository.cs
│       │       ├── IRefreshTokenRepository.cs
│       │       ├── IAuthorizationCodeRepository.cs
│       │       ├── IScopeRepository.cs
│       │       └── IUserConsentRepository.cs
│       │
│       ├── OneAuthCenter.Application/ # 应用层
│       │   ├── DTOs/                  # 数据传输对象
│       │   │   ├── Auth/              # 认证相关 DTO
│       │   │   ├── OAuth/             # OAuth 相关 DTO
│       │   │   ├── Client/            # 客户端相关 DTO
│       │   │   └── User/              # 用户相关 DTO
│       │   └── Services/              # 服务接口和实现
│       │       ├── ITokenService.cs   # JWT Token 服务接口
│       │       ├── IAuthService.cs    # 认证服务接口
│       │       ├── IOAuthService.cs   # OAuth 服务接口
│       │       ├── IClientService.cs  # 客户端服务接口
│       │       ├── IUserService.cs    # 用户服务接口
│       │       └── Implementations/   # 服务实现
│       │
│       ├── OneAuthCenter.Infrastructure/ # 基础设施层
│       │   ├── Data/                  # 数据访问
│       │   │   ├── AuthDbContext.cs   # EF Core 数据库上下文
│       │   │   └── DbInitializer.cs   # 数据库初始化器
│       │   ├── Configuration/         # 配置类
│       │   │   └── DatabaseSettings.cs # 数据库配置
│       │   ├── Extensions/            # 扩展方法
│       │   │   └── ServiceCollectionExtensions.cs
│       │   ├── Repositories/          # 仓储实现
│       │   │   ├── UserRepository.cs
│       │   │   ├── ClientRepository.cs
│       │   │   ├── RefreshTokenRepository.cs
│       │   │   ├── AuthorizationCodeRepository.cs
│       │   │   ├── ScopeRepository.cs
│       │   │   └── UserConsentRepository.cs
│       │   └── Services/              # 基础设施服务
│       │       └── TokenService.cs    # JWT Token 生成和验证
│       │
│       └── OneAuthCenter.API/         # API 层(表现层)
│           ├── Controllers/           # API 控制器
│           │   ├── AuthController.cs  # 认证控制器
│           │   ├── OAuthController.cs # OAuth 2.0 控制器
│           │   ├── ClientController.cs # 客户端管理控制器
│           │   └── UserController.cs  # 用户管理控制器
│           ├── Program.cs             # 应用程序入口
│           └── appsettings.json       # 配置文件(含 Swagger 配置)
│
├── database-examples/                 # 数据库配置示例
├── README.md                          # 项目说明文档
├── SETUP.md                           # 安装配置指南
├── DATABASE_CONFIG.md                 # 数据库配置指南
├── PROJECT_STRUCTURE.md               # 项目结构详解
├── IDENTITYSERVER_CONCEPTS.md         # IdentityServer4 核心概念详解
├── JWT_CERTIFICATE.md                 # JWT 证书配置指南
├── CORS_TOKEN_CONFIG.md               # CORS 和 Token 配置指南
└── CHANGELOG.md                       # 更新日志

四、核心功能

1、客户端集成库(OneAuthCenter.Client)

1.1 一行代码集成认证

  • builder.Services.AddOneAuthCenter()

1.2 3 种配置方式

  • 代码配置(适合开发环境)
  • 配置文件(适合生产环境)
  • 带 Scope 验证(快速配置)

1.3 自动 JWT 验证

  • 自动从认证中心获取 JWKS
  • 自动验证 Token 签名
  • 自动验证 Issuer 和 Audience

1.4 灵活的授权策略

  • 基于 Scope 的授权
  • 基于 Role 的授权
  • 自定义策略

1.5 开箱即用的示例

  • OrdersApi 示例项目
  • 完整的使用文档
  • 最佳实践指南

2、认证功能

2.1 用户注册与登录

2.2 JWT Token 生成和验证

  • 开发环境自动生成密钥并保存到 tempkey.rsa(类似 IdentityServer4 的 tempkey.jwk)
  • 应用重启后自动加载密钥,Token 不会失效
  • 动态 Issuer - 自动从 HTTP 请求获取(无需配置)
  • 生产环境使用证书文件(RSA 签名)

2.3 完整的 Scope 权限验证

  • OpenID Connect 标准 scopes(openid, profile, email, phone, address)
  • UserInfo 端点根据 scope 返回对应信息
  • Token 中包含 scope claims

2.4 刷新令牌机制

2.5 完整的 Token 可用性验证

  • Access Token 黑名单机制(JWT 撤销)
  • Refresh Token 撤销和过期检查
  • Token 唯一标识符 (jti claim)
  • 自动清理过期的黑名单记录

2.6 令牌撤销和登出

3、OAuth 2.0 支持

  • 授权码流程 (Authorization Code Flow)
  • 客户端凭证流程 (Client Credentials Flow)
  • 密码流程 (Resource Owner Password Credentials Flow)
  • 刷新令牌流程 (Refresh Token Flow)
  • PKCE 支持 (Proof Key for Code Exchange)

4、OpenID Connect 支持

  • ID Token 生成
  • UserInfo 端点
  • Discovery 端点 (/.well-known/openid-configuration)
  • JWKS 端点 (/.well-known/jwks.json) - 公钥发布
  • Token Revocation 端点 (/oauth/revocation) - RFC 7009
  • Token Introspection 端点 (/oauth/introspect) - RFC 7662
  • End Session 端点 (/oauth/endsession) - 标准登出

5、 用户管理

  • 用户 CRUD 操作
  • 角色管理
  • 密码修改
  • 用户状态管理

6、客户端管理

  • OAuth 客户端注册
  • 客户端配置管理
  • 密钥重置
  • 授权类型和作用域配置

7、安全特性

  • RSA 非对称加密签名(类似 IdentityServer4)
    • 开发环境自动生成临时密钥
    • 生产环境支持证书文件
    • 支持 JWKS 公钥发布
  • BCrypt 密码哈希(自适应、防彩虹表)
  • JWT Token 黑名单机制(超越 IdentityServer4)
  • PKCE (Proof Key for Code Exchange)
  • 用户同意管理
  • 令牌过期和轮换
  • 客户端凭证验证
  • 标准 Token 撤销和自省

五、安装运行

1、配置数据库连接

编辑 OneAuthCenter.API/appsettings.json,配置要使用的数据库(以SQLServer为例):

json 复制代码
{
  "DatabaseSettings": {
    "DatabaseType": "SqlServer",  // 可选: SqlServer, MySql, PostgreSql, Sqlite
    "ConnectionStrings": {
      "SqlServer": "Server=127.0.0.1;Database=OneAuthCenterDb;Trusted_Connection=True;User Id=username;Password=password;",
      "MySql": "Server=localhost;Database=OneAuthCenterDb;User=root;Password=yourpassword;",
      "PostgreSql": "Host=localhost;Database=OneAuthCenterDb;Username=postgres;Password=yourpassword;",
      "Sqlite": "Data Source=OneAuthCenter.db"
    }
  }
}

2、创建数据库迁移

bash 复制代码
cd src/NoUI/OneAuthCenter.API
dotnet ef migrations add InitialCreate --project ../OneAuthCenter.Infrastructure --context AuthDbContext

3、应用数据库迁移

bash 复制代码
dotnet ef database update --project ../OneAuthCenter.Infrastructure --context AuthDbContext

4、运行项目

bash 复制代码
dotnet run

5、访问 Swagger UI

打开浏览器访问:https://localhost:5001http://localhost:5000

六、数据库支持

OneAuthCenter 支持多种数据库,通过配置文件即可切换:

数据库 状态 推荐场景
SQL Server ✅ 默认 企业级应用
MySQL ✅ 支持 Web 应用
PostgreSQL ✅ 支持 企业级应用
SQLite ✅ 支持 开发/测试/小型应用
Oracle Database ✅ 支持 企业级应用

快速切换数据库:

json 复制代码
{
  "DatabaseSettings": {
    "DatabaseType": "MySql"  // 修改这里即可切换
  }
}

七、API 端点

1、认证 API (/api/auth)

  • POST /api/auth/register - 用户注册
  • POST /api/auth/login - 用户登录
  • POST /api/auth/refresh - 刷新令牌
  • POST /api/auth/revoke - 撤销令牌
  • POST /api/auth/logout - 用户登出

2、OAuth 2.0 API (/oauth)

  • GET /oauth/authorize - OAuth 授权端点
  • POST /oauth/consent - 用户同意端点
  • POST /oauth/token - Token 端点
  • GET /oauth/.well-known/openid-configuration - OpenID Connect 发现端点

3、用户管理 API (/api/user)

  • GET /api/user/me - 获取当前用户信息
  • GET /api/user/userinfo - OpenID Connect UserInfo 端点
  • GET /api/user - 获取所有用户(需管理员权限)
  • GET /api/user/{id} - 获取指定用户
  • PUT /api/user/{id} - 更新用户信息
  • DELETE /api/user/{id} - 删除用户(需管理员权限)
  • POST /api/user/change-password - 修改密码

4、客户端管理 API (/api/client)

  • GET /api/client - 获取所有客户端(需管理员权限)
  • GET /api/client/{clientId} - 获取指定客户端(需管理员权限)
  • POST /api/client - 创建客户端(需管理员权限)
  • PUT /api/client/{clientId} - 更新客户端(需管理员权限)
  • DELETE /api/client/{clientId} - 删除客户端(需管理员权限)
  • POST /api/client/{clientId}/reset-secret - 重置客户端密钥(需管理员权限)

八、使用示例

1、用户注册

bash 复制代码
POST /api/auth/register
Content-Type: application/json

{
  "username": "testuser",
  "email": "test@example.com",
  "password": "Password123!",
  "fullName": "测试用户"
}

2、用户登录

bash 复制代码
POST /api/auth/login
Content-Type: application/json

{
  "username": "testuser",
  "password": "Password123!"
}

响应:

bash 复制代码
{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "DRgb4TvHZe1qJZQbZ...",
  "tokenType": "Bearer",
  "expiresIn": 3600,
  "scope": "openid profile email"
}

3、OAuth 2.0 授权码流程

步骤 1:获取授权码

bash 复制代码
GET /oauth/authorize?
  response_type=code
  &client_id=client_app
  &redirect_uri=https://client.example.com/callback
  &scope=openid profile email
  &state=xyz
  &code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
  &code_challenge_method=S256
  
Authorization: Bearer {access_token}

步骤 2:交换授权码获取令牌

bash 复制代码
POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=授权码
&redirect_uri=https://client.example.com/callback
&client_id=client_app
&client_secret=client_secret
&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

4、刷新令牌

bash 复制代码
POST /api/auth/refresh
Content-Type: application/json

{
  "refreshToken": "DRgb4TvHZe1qJZQbZ..."
}

九、 源码

Gitcode: https://gitcode.com/bjzhang75/OneAuthCenter

源码下载:源码下载

相关推荐
步步为营DotNet3 小时前
深度解析.NET 中Nullable<T>:灵活处理可能为空值的类型
java·前端·.net
csdn_aspnet3 小时前
.NET 10 中的 ASP.NET Core:Blazor、API 和 OpenAPI 的重大更新
后端·asp.net·.net·.net10
weixin_421994781 天前
认识数据 - 变量与数据类型
c#·.net·.netcore
mudtools1 天前
深入理解飞书 Webhook 签名验证:一次踩坑到填坑的完整记录
网络·c#·.net·飞书
工业甲酰苯胺1 天前
如何一步步将 ASP.NET MVC 升级为.NET
asp.net·mvc·.net
闻缺陷则喜何志丹1 天前
【.NetAPI]统计标注的值、上公差、下公差
数学·.net·cad·netapi
一念一花一世界1 天前
Arbess项目实战 - 基于GitLab搭建.net项目自动化流水线
ci/cd·gitlab·.net·arbess
Eiceblue1 天前
【.NET 开发】通过 C# 实现 Excel 转 JSON
c#·.net·excel
fs哆哆1 天前
在VB.NET和VBA教程-操作Excel单元格的三个核心问题
ui·.net·excel