IGeekFan.FreeKit.AuthClient
用于在其他系统中对接 OpenIddict 认证中心,实现单点登录。
功能概览
| 功能 | 说明 |
|---|---|
| Token 验证 | 对接 OpenIddict 认证中心的 Token 验证 |
| 单点登录 | 多应用统一认证 |
| 配置扩展 | OpenIddictValidationOptions 配置项 |
| 自动注册 | 自动注册认证服务到 DI 容器 |
快速开始
1. 安装包
dotnet add package IGeekFan.FreeKit.AuthClient
2. 注册服务
// Program.cs
builder.Services.AddFreeKitValidation();
3. 启用中间件
// Program.cs
app.UseAuthentication();
app.UseAuthorization();
4. 配置
{
"OpenIddictValidation": {
"Authority": "https://auth.example.com",
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"RequireHttpsMetadata": false
}
}
配置项说明
| 属性 | 说明 | 默认值 |
|---|---|---|
Authority | 认证中心地址 | 必填 |
ClientId | 客户端 ID | 必填 |
ClientSecret | 客户端密钥 | 必填 |
RequireHttpsMetadata | 是否要求 HTTPS | true |
ScopeName | 请求的 Scope | openid profile |
工作原理
完整示例
前端应用接入
var builder = WebApplication.CreateBuilder(args);
// 注册认证服务
builder.Services.AddFreeKitValidation();
// 添加授权策略
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("ApiScope", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireClaim("scope", "api");
});
});
var app = builder.Build();
// 启用认证中间件
app.UseAuthentication();
app.UseAuthorization();
// 受保护的 API
app.MapGet("/api/profile", async (HttpContext ctx) =>
{
var user = ctx.User;
return Results.Ok(new
{
Name = user.Identity?.Name,
Claims = user.Claims.Select(c => new { c.Type, c.Value })
});
}).RequireAuthorization("ApiScope");
app.Run();
多应用对接
// 应用 A
builder.Services.AddFreeKitValidation();
builder.Configuration.AddJsonFile("appsettings.AppA.json");
// 应用 B
builder.Services.AddFreeKitValidation();
builder.Configuration.AddJsonFile("appsettings.AppB.json");
微服务间调用
// 服务间调用时携带 Token
public class ExternalApiService
{
private readonly HttpClient _httpClient;
private readonly ITokenService _tokenService;
public async Task<string> CallExternalApiAsync()
{
var token = await _tokenService.GetAccessTokenAsync();
_httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var response = await _httpClient.GetAsync("https://api.example.com/data");
return await response.Content.ReadAsStringAsync();
}
}
与 Auth 模块的关系
| 组件 | 说明 |
|---|---|
| Auth.Center | 认证中心,颁发 Token |
| Auth.Client | 客户端库,验证 Token |
| 业务服务 | 使用 Client 验证请求 |
故障排查
| 问题 | 解决方案 |
|---|---|
| 401 Unauthorized | 检查 Authority 地址是否正确 |
| Token 验证失败 | 检查 ClientId 和 ClientSecret |
| CORS 错误 | 在认证中心配置客户端域名 |
| HTTPS 错误 | 开发环境设置 RequireHttpsMetadata: false |
| Scope 不足 | 检查认证中心配置的 Scope |