一、创建新的 ASP.NET Core Web API 项目
打开 Visual Studio,点击 创建新项目。
1.选择
ASP.NET Core Web API 模板,点击 下一步。
2.设置项目名称
如 IdentityServer4Demo,并选择保存位置,点击 创建。
3.选择目标框架
二、安装 IdentityServer4 包
1.在解决方案资源管理器中,
右键点击项目名称(IdentityServer4Demo)并选择 管理 NuGet 包。
2.在浏览选项卡中搜索 Duende.IdentityServer 并点击 安装。
注意:从 IdentityServer4 v4 开始,由 Duende 维护,所以使用 Duende.IdentityServer 包。
3.配置 IdentityServer
接下来,你需要在项目中配置 IdentityServer。
(1) 修改 Program.cs
在 .NET 6 或更高版本中,Startup.cs 已经合并到了 Program.cs 中。你需要在 Program.cs 中进行以下修改。
- 找到builder.Services 部分,添加 IdentityServer 的服务,appsetting.json中添加相应配置:
下面是全部 Program.cs 代码:"IdentityServer": { "Authority": "http://localhost:5000", "Audience": "api1" }
using IdentityDemo.Helper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
var builder = WebApplication.CreateBuilder(args);
// 加载配置信息
var configuration = builder.Configuration;
var environment = builder.Environment;
// 添加 IdentityServer 服务
var identityServerBuilder = builder.Services.AddIdentityServer()
.AddInMemoryClients(IdentityConfig.Clients) // 加载客户端配置
.AddInMemoryApiScopes(IdentityConfig.ApiScopes) // 加载 API 范围配置
.AddInMemoryApiResources(IdentityConfig.ApiResources) // 加载 API 资源配置
.AddInMemoryIdentityResources(IdentityConfig.IdentityResources); // 加载身份资源配置
// 使用开发者签名证书仅在开发环境
if (environment.IsDevelopment())
{
identityServerBuilder.AddDeveloperSigningCredential(); // 开发环境使用开发签名证书
}
else
{
// 在生产环境中应使用真实的签名凭据
// identityServerBuilder.AddSigningCredential(...);
}
// JWT 身份验证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = configuration["IdentityServer:Authority"] ?? "http://localhost:5000"; // 从配置文件中读取 Authority
options.Audience = configuration["IdentityServer:Audience"] ?? "api1"; // 确保这个与配置的 API 范围一致
options.RequireHttpsMetadata = !environment.IsDevelopment(); // 仅在生产环境强制使用 HTTPS
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
// 如果你想允许所有 API 可访问,可以取消注释以下代码:
// ValidAudience = "yourapi", // 可以从配置文件中设置 Audience
// ValidIssuer = "http://localhost:5000", // 可以从配置文件中设置 Issuer
};
});
// 添加控制器服务
builder.Services.AddControllers();
// 添加日志记录服务(可选)
builder.Services.AddLogging();
var app = builder.Build();
// 配置 HTTP 请求管道
// 根据环境配置 HTTPS 强制策略
if (!environment.IsDevelopment())
{
app.UseHttpsRedirection(); // 生产环境强制使用 HTTPS
}
app.UseRouting();
// 启用 IdentityServer 中间件
app.UseIdentityServer(); // 这一步要在 UseAuthorization 之前
// 启用授权
app.UseAuthorization();
app.MapControllers();
app.Run();
(2) 配置 IdentityServer 资源
在项目中,右键点击项目名并选择 添加 -> 新建文件,选择 类,命名为 Config.cs。
在 Config.cs 中,定义 IdentityServer 资源、客户端、API 范围等:
using Duende.IdentityServer.Models;
namespace IdentityDemo.Helper
{
public class IdentityConfig
{
// 定义身份资源(Identity Resources)
public static IEnumerable<IdentityResource> IdentityResources =>
new IdentityResource[]
{
new IdentityResources.OpenId(),
new IdentityResources.Profile()
};
// 定义 API 范围(API Scopes)
public static IEnumerable<ApiScope> ApiScopes =>
new ApiScope[]
{
new ApiScope("api1", "My API")
};
// 定义 API 资源(API Resources)
public static IEnumerable<ApiResource> ApiResources =>
new ApiResource[]
{
new ApiResource("api1", "My API")
{
Scopes = { "api1" }
}
};
// 定义客户端(Clients)
public static IEnumerable<Client> Clients =>
new Client[]
{
// 客户端凭证流
new Client
{
ClientId = "client",
AllowedGrantTypes = GrantTypes.ClientCredentials, // 客户端凭证流
ClientSecrets =
{
new Secret("secret".Sha256()) // 客户端秘钥
},
AllowedScopes = { "api1" } // 允许的 API 范围
},
// 授权码流(用于前端应用)
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Code,
// Redirect URLs after login/logout
RedirectUris = { "https://localhost:5002/signin-oidc" },
PostLogoutRedirectUris = { "https://localhost:5002/signout-callback-oidc" },
// Secret for authentication
ClientSecrets = { new Secret("secret".Sha256()) },
// Scopes that client has access to
AllowedScopes = new List<string>
{
"openid", "profile", "api1"
},
// Enable PKCE for security
RequirePkce = true,
AllowPlainTextPkce = false
}
};
}
}
4. 创建受保护的 API
为了测试 IdentityServer4 的身份验证,你可以创建一个受保护的 API。
- 右键点击 Controllers 文件夹,选择 添加 -> 控制器,选择 API Controller 模板,命名为 TestController。
- 在TestController.cs 中,使用 [Authorize] 属性标记 API,使其成为受保护的资源:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace IdentityServer4Demo.Controllers
{
[Authorize] // 需要身份验证
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok("Hello from a protected API!");
}
}
}
5. 运行并测试 IdentityServer
1.启动项目
2.获取访问令牌
使用 Apifox 示例:
如果请求成功,你将会收到一个带有 access_token 的响应。
3.使用访问令牌调用受保护的 API
示例请求:
如果身份验证成功,你将会看到返回的消息:Hello from a protected API!