Keycloak.Admin.Sdk
26.8.1-preview.2
dotnet add package Keycloak.Admin.Sdk --version 26.8.1-preview.2
NuGet\Install-Package Keycloak.Admin.Sdk -Version 26.8.1-preview.2
<PackageReference Include="Keycloak.Admin.Sdk" Version="26.8.1-preview.2" />
<PackageVersion Include="Keycloak.Admin.Sdk" Version="26.8.1-preview.2" />
<PackageReference Include="Keycloak.Admin.Sdk" />
paket add Keycloak.Admin.Sdk --version 26.8.1-preview.2
#r "nuget: Keycloak.Admin.Sdk, 26.8.1-preview.2"
#:package Keycloak.Admin.Sdk@26.8.1-preview.2
#addin nuget:?package=Keycloak.Admin.Sdk&version=26.8.1-preview.2&prerelease
#tool nuget:?package=Keycloak.Admin.Sdk&version=26.8.1-preview.2&prerelease
Keycloak.Admin.Sdk
简体中文 | English
面向 .NET 10 / Native AOT 的 Keycloak Admin REST API 客户端,当前仅支持 Keycloak 26.8.1。主包引用 Microsoft.Extensions.Http 10.0.14 和 Microsoft.Extensions.Http.Resilience 10.11.0,使用源生成 JSON 元数据,默认关闭反射序列化。仓库固定 .NET SDK 10.0.403。
公开 API 仍可能调整。开发时可引用核心项目。
快速开始
先在 Keycloak 配置服务账号及目标 realm 的管理权限,再在 ASP.NET Core 或 Generic Host 中注册:
using Keycloak.Admin.Sdk;
using Microsoft.Extensions.DependencyInjection;
var configuration = builder.Configuration;
builder.Services.AddKeycloakAdminSdk(options =>
{
options.Server = new Uri("https://keycloak.example.com/auth/");
options.AuthenticationRealm = "master";
options.ClientId = "admin-service";
options.ClientSecret = (_, ct) => ValueTask.FromResult(
configuration["Keycloak:ClientSecret"]
?? throw new InvalidOperationException("Missing Keycloak client secret"));
});
在业务服务中注入客户端:
using Keycloak.Admin.Sdk;
public sealed class UserService(IKeycloakAdminClient sdk)
{
public Task<AdminResponse<List<UserRepresentation>>> GetUsersAsync(
string realm, CancellationToken cancellationToken)
=> sdk.Users.GetUsersAsync(realm, first: 0, max: 20,
cancellationToken: cancellationToken);
}
宿主应从安全配置源提供 Keycloak:ClientSecret。DI 容器管理 HTTP 客户端和 token provider 的生命周期,默认禁用自动重定向。认证 realm 与目标 realm 独立;realm 使用名称,客户端路径参数使用内部 UUID,而非 OIDC clientId。所有网络方法支持取消;分页直接采用服务端参数,不保证快照或总数。
IKeycloakAdminClient 的资源入口返回 IUsersApi 等生成接口,便于业务测试替换。DI 同时支持接口和具体类型,同一名称解析到同一客户端实例,详见 接口与测试替身。
该 DI 入口默认注册底层客户端,不自动安装支持策略。需要在请求前限制稳定支持范围时,可先获取可信的服务端能力快照并通过 options.Client.RequestPolicy 配置策略,或使用异步的 KeycloakSupportedClient.CreateAsync。手动构造、已有 token 接入和策略初始化见 认证与 DI 和 能力策略。
DI 入口 AddKeycloakAdminSdk 提供 options.Resilience,默认关闭。开启后,仅为无内容 GET/HEAD 提供瞬态重试、超时和独立读熔断;写请求与 Token POST 绕过该管道。配置、401 组合次数和异常约定见 HTTP 弹性策略。
客户端与功能开关
功能开关包依赖微软遥测组件,遥测默认关闭。
new KeycloakAdminClient(...) 提供底层 API 传输。需要在发送前限制支持范围时,使用 KeycloakSupportedClient.CreateAsync;托管功能开关使用 KeycloakFeatureManagedClient.CreateAsync。配置见 能力策略、功能开关与遥测,DI 见 认证与错误处理。
请求与响应约定
- 调用方释放
HttpClient和 token provider。请求消费并释放传入的HttpContent,每次调用须新建内容;OpenStreamAsync的返回值由调用方释放。 - 常规响应保留状态码、Location、header、原始内容和可选强类型
Body;HasBody区分空响应。Location 不会被自动跟随。 - DTO 的 null 属性默认省略,false、0、空集合会发送。显式 JSON null、动态载荷和自定义源生成模型可通过
SendAsync/SendJsonAsync提交;媒体类型示例见 特殊契约。 - 更新时应构造明确的请求,避免回写只读字段、掩码密钥或 brief 数据。26.8.1 客户端 PUT 若省略
authorizationServicesEnabled=true会关闭该客户端的授权服务。 - HTTP 错误抛出
KeycloakAdminException;401 恢复默认关闭,可显式开启一次安全读取重放。写入超时后的结果可能未知。详细规则见 认证与错误处理。
Keycloak 26.8.1 能力边界
主包按 HTTP 方法 + 路径生成了 520 项 Admin API 操作。已纳入支持范围的功能包括 realm、用户、组、角色、客户端、客户端作用域、身份提供方、认证流程、授权策略、组织、工作流及管理控制台扩展等。实际可用范围还取决于声明的 FGAP 路线、服务器功能配置和账号权限。
| 范围 | 操作数 | 验证 |
|---|---|---|
| 完整生成契约 | 520 | 每项独立功能契约单测 |
fgap-v2-stable(默认) |
478 | 托管及 Linux Native AOT 真实业务验收 |
fgap-v1-compat |
492 | 托管及 Linux Native AOT 真实业务验收 |
以下接口不计入两条正式路线的默认验收范围;非 Stable 功能通过独立计划按环境逐项验证:
| Keycloak 功能 | 阶段 | 操作数 | 不支持的原因 |
|---|---|---|---|
oid4vc-vci |
Preview | 7 | 凭证管理功能处于预览阶段,按当前支持策略排除 |
ssf |
Experimental | 19 | 功能处于实验阶段,按当前支持策略排除 |
client-types |
Experimental | 2 | 仅托管 v2 组合完成独立验证与晋升;默认关闭,需 schema 2 显式许可和宿主开关;AOT/v1 尚未晋升 |
schema 2 支持 Managed、NativeAot 和 Portable 验证配置。托管使用 FeatureManagement,原生可使用主包的 KeycloakFeatureSnapshotGate;开关不能覆盖版本、阶段或证据拒绝。旧配置保持同时要求托管和 AOT 证据。接入见能力策略;独立验证、晋升与最后的灰度开关见非 Stable 功能流程。
默认 v2 路线另外排除 14 个 FGAP v1 专用接口;这些接口已在 v1 兼容路线上通过验收。生成方法存在不等于 SDK 承诺支持该接口:使用 KeycloakSupportedClient.CreateAsync 可在发送请求前执行版本、成熟度、路线、服务器功能及验证状态检查。直接构造 KeycloakAdminClient 提供底层传输,不自动应用支持策略。
范围以 Keycloak 26.8.1 的 Admin API 为准,不涵盖控制台静态资源、独立 OAuth/OIDC、Account、SCIM 或预览 Client Admin API v2 等协议,也不能预先枚举第三方 SPI 扩展。结果不自动适用于其他 Keycloak 版本,也不代表已覆盖所有权限和配置组合。
逐接口状态及排除原因见 支持矩阵,分类汇总见 验证索引,实测环境和证据见 真实验收。支持策略的接入方式见 能力策略。
开发与验证
从仓库根目录执行;真实服务及容器原生验证需要 Docker:
dotnet run --file tools/Verify.cs -- --skip-native-publish # 构建、单测与覆盖率
dotnet run --file tools/Verify.cs -- --native-container # 另做 Linux Native AOT 验证
dotnet run --file local/keycloak/Service.cs # 启动本地 Keycloak + PostgreSQL
本地控制台:http://127.0.0.1:18080/admin/,默认用户 admin,随机密码保存在生成的 local/keycloak/.env。数据库持久化、服务命令见 本地环境;测试入口与报告见 测试说明。不带参数的 Verify.cs 验证当前平台原生程序,所需编译工具见测试说明。
文档
Apache License 2.0;契约来源及归属见 第三方说明。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Http (>= 10.0.14)
- Microsoft.Extensions.Http.Resilience (>= 10.11.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Keycloak.Admin.Sdk:
| Package | Downloads |
|---|---|
|
Keycloak.Admin.Sdk.FeatureManagement
Managed feature flags and opt-in Application Insights telemetry for Keycloak Admin SDK. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.8.1-preview.2 | 44 | 11/6/2026 |
| 26.8.1-preview.1 | 47 | 11/5/2026 |
## Keycloak.Admin.Sdk
适用于 .NET 10 的 Keycloak 26.8.1 Admin REST API 客户端,支持 Native AOT、服务账号认证、依赖注入、可选弹性策略和版本能力检查。
常规管理接口调用推荐使用本包;托管应用需要动态开关和灰度控制时,可安装依赖本包的 `Keycloak.Admin.Sdk.FeatureManagement`。
### 安装
```shell
dotnet add package Keycloak.Admin.Sdk
```
### 使用示例
以下托管示例使用已有访问令牌。先设置 `KEYCLOAK_ACCESS_TOKEN`,再替换服务器地址和 realm;令牌须具有读取 serverinfo 和目标管理接口的权限,服务器须匹配目标版本及默认 FGAP v2 路线。
```csharp
using Keycloak.Admin.Sdk;
using Keycloak.Admin.Sdk.Capabilities;
using var cancellation = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var ct = cancellation.Token;
var server = new Uri("https://keycloak.example.com/");
using var http = new HttpClient(new SocketsHttpHandler { AllowAutoRedirect = false });
var tokens = new StaticAccessTokenProvider(
Environment.GetEnvironmentVariable("KEYCLOAK_ACCESS_TOKEN")
?? throw new InvalidOperationException("请设置 KEYCLOAK_ACCESS_TOKEN"));
var support = new KeycloakSupportConfiguration(
KeycloakTarget.Version, KeycloakRuntimeProfile.Managed);
IKeycloakAdminClient sdk = await KeycloakSupportedClient.CreateAsync(
http, server, tokens, support, cancellationToken: ct);
var users = await sdk.Users.GetUsersAsync("target-realm", max: 20, cancellationToken: ct);
foreach (var user in users.Body ?? [])
Console.WriteLine(user.Username);
```
- `KeycloakSupportedClient` 初始化时读取真实服务器能力,后续请求在发送前检查版本、阶段、FGAP 路线、服务器功能和验证证据。
- 也可通过 `AddKeycloakAdminSdk` 注册并注入 `IKeycloakAdminClient`;直接构造客户端或默认 DI 注册不会自动安装上述支持策略,配置方式见能力策略文档。
- Native AOT 应选择 `KeycloakRuntimeProfile.NativeAot`,并使用具有对应路线及 RID 验证证据的配置。
- 服务账号认证可使用 `ClientCredentialsTokenProvider`;HTTP 客户端、认证提供方及调用生命周期由宿主管理。
### 文档
- [快速开始](https://github.com/sugarst/Keycloak.Admin.Sdk#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B)
- [认证与依赖注入](https://github.com/sugarst/Keycloak.Admin.Sdk/blob/main/docs/authentication-and-errors.md)
- [版本能力与 FGAP 路线](https://github.com/sugarst/Keycloak.Admin.Sdk/blob/main/docs/capability-policy.md)
- [版本变更](https://github.com/sugarst/Keycloak.Admin.Sdk/blob/main/CHANGELOG.md)
- [开源项目](https://github.com/sugarst/Keycloak.Admin.Sdk)