.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),生产环境应使用数据库存储配置(如 AddConfigurationStore和 AddOperationalStore)。

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

相关推荐
1-1=019 小时前
.NET Core 文件系统
.net·.netcore·1024程序员节
IsITGirl20 小时前
VMware Fusion(Mac)Windows ARM 虚拟机 NAT (vmnet8) 报错解决记录
windows·macos·.net·桥接模式
学以智用2 天前
WinForms / WPF / Blazor 项目模板详解
.net
1-1=02 天前
.NET Core 内存管理
.net·.netcore
无风听海2 天前
.NET 10之Span技术总结
.net
1-1=02 天前
.NET Core 配置与选项
.net·.netcore·1024程序员节
mudtools2 天前
在飞书 SDK 上用 Microsoft Agent Framework 搭一个能干活的工作搭子
人工智能·ai·.net·飞书·agent
ChaITSimpleLove2 天前
Layout.WatchDog.NET 1.5.0-beta.3 发布:统一全后端雪花 ID 策略,数据库能力矩阵一览
.net·watchdog·日志记录器·节点资源监控看板·.net专属轻量级日志中心
IT规划师2 天前
MQTT 实战 - 放下炫技,8 年踩坑的真心话与方法论(收官)
物联网·.net