.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 运行时兼容

相关推荐
魏杨杨10 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
AI行业学习18 小时前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.19】
.net
切糕师学AI21 小时前
.NET 中 CallerMemberName 与 StackTrace 的深度对比
.net·调用栈·stacktrace·callermember
步步为营DotNet1 天前
解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践
微服务·asp.net·.net
唐青枫1 天前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
c#·.net
rockey6272 天前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
叫我少年2 天前
ASP.NET Core 最小 API 快速参考
.net·api
步步为营DotNet2 天前
深入.NET 11:C# 14 在边缘计算数据处理的优化与实践
c#·.net·边缘计算
步步为营DotNet3 天前
洞悉.NET 11:Blazor 与 Microsoft.Extensions.AI 的融合创新实践
人工智能·microsoft·.net
回忆2012初秋3 天前
.NET 8.0 实战:基于 MQTTnet 封装高可用的 MQTT 发布/订阅工具类
开发语言·mqtt·.net