.Net9通过 IdentityServer4完成认证鉴权

gitee项目地址:https://gitee.com/workRep/identity-server4-demo.git

在 .NET 9 中,虽然 IdentityServer4 已停止官方维护,但其核心功能已由 Duende IdentityServer ​ 接管。对于 Web API 项目,你需要分别配置认证服务器 (IdentityServer) ​ 和受保护的 API 资源

以下是详细的集成步骤:

1. 认证服务器 (IdentityServer) 配置

首先,创建一个独立的 ASP.NET Core 项目作为认证服务器。

1.1 安装 NuGet 包
复制代码
dotnet add package Duende.IdentityServer
1.2 配置服务 (Program.cs)
复制代码
using Duende.IdentityServer.Models;

var builder = WebApplication.CreateBuilder(args);

// 配置 IdentityServer
builder.Services.AddIdentityServer()
    .AddInMemoryApiScopes(Config.ApiScopes) // 定义 API 范围
    .AddInMemoryClients(Config.Clients)     // 定义客户端
    .AddDeveloperSigningCredential();        // 开发环境签名证书

var app = builder.Build();
app.UseIdentityServer();
app.Run();
1.3 定义配置类 (Config.cs)
复制代码
public static class Config
{
    public static IEnumerable<ApiScope> ApiScopes =>
        new List<ApiScope>
        {
            new ApiScope("api1", "My API")
        };

    public static IEnumerable<Client> Clients =>
        new List<Client>
        {
            new Client
            {
                ClientId = "client",
                AllowedGrantTypes = GrantTypes.ClientCredentials,
                //AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,//使用账户密码模式
                ClientSecrets = { new Secret("secret".Sha256()) },
                AllowedScopes = { "api1" }
            }
        };
}

2. Web API 资源服务器配置

在你的 Web API 项目中,配置 JWT Bearer 认证。

2.1 安装 NuGet 包
复制代码
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2.2 配置认证 (Program.cs)
复制代码
var builder = WebApplication.CreateBuilder(args);

// 配置认证
builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "https://localhost:5001"; // IdentityServer 地址
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false
        };
    });

// 配置授权
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ApiScope", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "api1");
    });
});

builder.Services.AddControllers();

var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
2.3 保护控制器

在需要保护的控制器或方法上添加 [Authorize]特性。

复制代码
[ApiController]
[Route("[controller]")]
[Authorize(Policy = "ApiScope")] // 应用授权策略
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Protected data");
    }
}

3. 测试流程

  1. 启动认证服务器:运行 IdentityServer 项目(通常在端口 5001)。

  2. 获取 Token:使用 Postman 或 curl 向认证服务器请求 Token。

    复制代码
    curl -X POST "https://localhost:5001/connect/token" \
         -H "Content-Type: application/x-www-form-urlencoded" \
         -d "client_id=client&client_secret=secret&grant_type=client_credentials&scope=api1"
  3. 访问 API :将返回的 access_token放在请求头中访问受保护的 API。

    复制代码
    Authorization: Bearer <your_access_token>

4. 注意事项

  • HTTPS 要求 :在生产环境中,必须使用 HTTPS 并配置真实的签名证书(替换 AddDeveloperSigningCredential)。

  • 数据持久化 :示例使用了内存配置 (InMemory),生产环境应使用数据库存储配置(如 AddConfigurationStoreAddOperationalStore)。

  • .NET 9 兼容性:Duende IdentityServer 完全支持 .NET 9,但需确保引用的包版本与 .NET 9 运行时兼容

相关推荐
rockey6274 小时前
基于AScript的JavaScript脚本语言发布啦
javascript·c#·.net·js·script
Java面试题总结7 小时前
LeetCode 93.复原IP地址
算法·leetcode·职场和发展·.net
慧都小妮子9 小时前
SciChart WPF v9.0 更新详解:矢量场图表、堆叠箱线图与 MVVM 轴同步来了
c#·.net·wpf·数据可视化·图表控件·图表
海盗123414 小时前
.NET编码规范05-Roslyn分析器与StyleCop
.net
小堂子这厢有礼了2 天前
Chet.Admin 权限模型:菜单级 + 按钮级 + 行级三层防护
前端·后端·信息可视化·前端框架·.net
AneiangSoft2 天前
Aneiang.Yarp v2.3.0.25:让 AI 成为你的 API 网关运维副驾驶
网关·.net·代理·dashboard·yarp
abcd_zjq3 天前
Visual studio community 2026 安装缺少 Microsoft.net.4.8.FullRedist.20H2
microsoft·.net·visual studio
桑榆肖物3 天前
在 .NET MAUI 里接入 PP-OCRv6 文本检测实现查找并点击
数据库·redis·.net·maui