Keycloak.AuthServices Implementation Guide
Quick Start
Choose your task and load the appropriate reference:
- JWT Bearer Authentication (Web API) → Continue below
- OIDC Authentication (Web App) → Load authentication.md
- Authorization & RBAC → Load authorization.md
- Resource Protection & Authorization Server → Load resource-protection.md
- Admin REST API SDK → Load admin-sdk.md
- Protection API SDK → Load protection-api.md
- Developer Experience (Aspire, Templates) → Load devex.md
- Configuration Reference → Load configuration.md
- Recipes & Troubleshooting → Load troubleshooting.md
- Token Introspection (Lightweight Tokens) → Load authorization.md (see "Token Introspection" section)
- Organization Authorization (Multi-Tenancy) → Load organization-authorization.md
- RFC 8414 Server Metadata Discovery → Load authentication.md (see "Server Metadata Discovery" section)
- Custom Token Provider (IKeycloakAccessTokenProvider) → Load resource-protection.md (see "IKeycloakAccessTokenProvider" section)
- Extensible Policy Builder (IProtectedResourcePolicyBuilder) → Load resource-protection.md (see "IProtectedResourcePolicyBuilder" section)
- Pluggable Parameter Resolvers → Load resource-protection.md (see "Pluggable Parameter Resolvers" section)
Packages Overview
| Package |
Purpose |
Keycloak.AuthServices.Authentication |
JWT Bearer (Web API) and OpenID Connect (Web App) authentication |
Keycloak.AuthServices.Authorization |
RBAC (realm/client roles), Authorization Server client, [ProtectedResource] attribute, organization authorization |
Keycloak.AuthServices.Sdk |
Hand-written Admin REST API + Protection API HTTP clients |
Keycloak.AuthServices.Sdk.Kiota |
Auto-generated (Kiota) Admin REST API client — full API coverage |
Keycloak.AuthServices.Common |
Shared configuration (KeycloakInstallationOptions), claims utilities |
Keycloak.AuthServices.OpenTelemetry |
Metrics and tracing instrumentation |
Keycloak.AuthServices.Aspire.Hosting |
.NET Aspire KeycloakResource integration |
Keycloak.AuthServices.Templates |
dotnet new project templates |
Minimal Web API Setup
dotnet add package Keycloak.AuthServices.Authentication
dotnet add package Keycloak.AuthServices.Common
using Keycloak.AuthServices.Authentication;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddKeycloakWebApiAuthentication(builder.Configuration);
builder.Services.AddAuthorization();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapGet("/", () => "Hello World!").RequireAuthorization();
app.Run();
// appsettings.json — "Keycloak" section (kebab-case from adapter config)
{
"Keycloak": {
"realm": "Test",
"auth-server-url": "http://localhost:8080/",
"ssl-required": "none",
"resource": "test-client",
"verify-token-audience": true,
"credentials": {
"secret": "your-client-secret"
}
}
}
Configuration Section
All packages bind to "Keycloak" config section by default. Key properties:
| Property |
Description |
realm |
Keycloak realm name |
auth-server-url |
Keycloak server URL (e.g., http://localhost:8080/) |
resource |
Client ID |
ssl-required |
none, external, or all |
verify-token-audience |
Validate audience claim against resource |
credentials.secret |
Client secret (confidential clients) |
Both kebab-case (Keycloak adapter format) and PascalCase are supported.
Adding Authorization (RBAC)
dotnet add package Keycloak.AuthServices.Authorization
builder.Services.AddKeycloakAuthorization(builder.Configuration)
.AddAuthorizationBuilder()
.AddPolicy("AdminOnly", policy => policy.RequireRealmRoles("admin"))
.AddPolicy("EditorOnly", policy => policy.RequireResourceRoles("editor"));
Adding Authorization Server (Resource Protection)
builder.Services
.AddKeycloakAuthorization()
.AddAuthorizationServer(builder.Configuration);
app.MapGet("/workspaces", () => "Hello World!")
.RequireProtectedResource("workspaces", "workspace:read");
Adding Admin SDK
dotnet add package Keycloak.AuthServices.Sdk
builder.Services.AddKeycloakAdminHttpClient(builder.Configuration);
app.MapGet("/users", async (IKeycloakUserClient client) =>
await client.GetUsers("my-realm"));
Essential Patterns
- Configuration section: defaults to
"Keycloak", override via configSectionName parameter
- IHttpClientBuilder: all HTTP clients return
IHttpClientBuilder for resilience, handlers, etc.
- Token management: use
Duende.AccessTokenManagement for service account tokens
- OpenTelemetry:
AddKeycloakAuthServicesInstrumentation() for metrics and tracing
- Aspire:
AddKeycloakContainer("keycloak") + AddRealm("Test") for local dev
Reference Documentation
- authentication.md — JWT Bearer and OIDC setup, all overloads, adapter file config, RFC 8414 server metadata discovery
- authorization.md — RBAC, realm/client roles, role claims transformation, token introspection
- organization-authorization.md — Organization-based multi-tenancy, membership requirements, parameter resolvers
- resource-protection.md — Authorization Server, Protected Resource Builder, dynamic resources, policy provider, IKeycloakAccessTokenProvider, IProtectedResourcePolicyBuilder, pluggable parameter resolvers
- admin-sdk.md — Admin REST API (hand-written + Kiota), access token management
- protection-api.md — UMA Protection API, resource/permission/policy management
- devex.md — .NET Aspire, templates, OpenTelemetry
- configuration.md — All configuration options, naming conventions, adapter file
- troubleshooting.md — Common issues, recipes, debugging
1---2name: keycloak-auth-services3description: Implementation guide for Keycloak.AuthServices .NET library — authentication (JWT Bearer, OIDC, RFC 8414), authorization (RBAC, resource protection, Authorization Server, organizations, multi-tenancy), Admin REST API SDK, Protection API SDK, and developer experience tooling (.NET Aspire, templates, OpenTelemetry). Trigger phrases include Keycloak.AuthServices, ProtectedResource, Admin SDK, Protection API, organization, RFC 8414, token introspection.4---56# Keycloak.AuthServices Implementation Guide78## Quick Start910Choose your task and load the appropriate reference:11121. **JWT Bearer Authentication (Web API)** → Continue below132. **OIDC Authentication (Web App)** → Load [authentication.md](references/authentication.md)143. **Authorization & RBAC** → Load [authorization.md](references/authorization.md)154. **Resource Protection & Authorization Server** → Load [resource-protection.md](references/resource-protection.md)165. **Admin REST API SDK** → Load [admin-sdk.md](references/admin-sdk.md)176. **Protection API SDK** → Load [protection-api.md](references/protection-api.md)187. **Developer Experience (Aspire, Templates)** → Load [devex.md](references/devex.md)198. **Configuration Reference** → Load [configuration.md](references/configuration.md)209. **Recipes & Troubleshooting** → Load [troubleshooting.md](references/troubleshooting.md)2110. **Token Introspection (Lightweight Tokens)** → Load [authorization.md](references/authorization.md) (see "Token Introspection" section)2211. **Organization Authorization (Multi-Tenancy)** → Load [organization-authorization.md](references/organization-authorization.md)2312. **RFC 8414 Server Metadata Discovery** → Load [authentication.md](references/authentication.md) (see "Server Metadata Discovery" section)2413. **Custom Token Provider (IKeycloakAccessTokenProvider)** → Load [resource-protection.md](references/resource-protection.md) (see "IKeycloakAccessTokenProvider" section)2514. **Extensible Policy Builder (IProtectedResourcePolicyBuilder)** → Load [resource-protection.md](references/resource-protection.md) (see "IProtectedResourcePolicyBuilder" section)2615. **Pluggable Parameter Resolvers** → Load [resource-protection.md](references/resource-protection.md) (see "Pluggable Parameter Resolvers" section)2728## Packages Overview2930| Package | Purpose |31|---------|---------|32| `Keycloak.AuthServices.Authentication` | JWT Bearer (Web API) and OpenID Connect (Web App) authentication |33| `Keycloak.AuthServices.Authorization` | RBAC (realm/client roles), Authorization Server client, `[ProtectedResource]` attribute, organization authorization |34| `Keycloak.AuthServices.Sdk` | Hand-written Admin REST API + Protection API HTTP clients |35| `Keycloak.AuthServices.Sdk.Kiota` | Auto-generated (Kiota) Admin REST API client — full API coverage |36| `Keycloak.AuthServices.Common` | Shared configuration (`KeycloakInstallationOptions`), claims utilities |37| `Keycloak.AuthServices.OpenTelemetry` | Metrics and tracing instrumentation |38| `Keycloak.AuthServices.Aspire.Hosting` | .NET Aspire `KeycloakResource` integration |39| `Keycloak.AuthServices.Templates` | `dotnet new` project templates |4041## Minimal Web API Setup4243```bash44dotnet add package Keycloak.AuthServices.Authentication45dotnet add package Keycloak.AuthServices.Common46```4748```csharp49using Keycloak.AuthServices.Authentication;5051var builder = WebApplication.CreateBuilder(args);5253builder.Services.AddKeycloakWebApiAuthentication(builder.Configuration);54builder.Services.AddAuthorization();5556var app = builder.Build();57app.UseAuthentication();58app.UseAuthorization();5960app.MapGet("/", () => "Hello World!").RequireAuthorization();61app.Run();62```6364```json65// appsettings.json — "Keycloak" section (kebab-case from adapter config)66{67 "Keycloak": {68 "realm": "Test",69 "auth-server-url": "http://localhost:8080/",70 "ssl-required": "none",71 "resource": "test-client",72 "verify-token-audience": true,73 "credentials": {74 "secret": "your-client-secret"75 }76 }77}78```7980## Configuration Section8182All packages bind to `"Keycloak"` config section by default. Key properties:8384| Property | Description |85|----------|-------------|86| `realm` | Keycloak realm name |87| `auth-server-url` | Keycloak server URL (e.g., `http://localhost:8080/`) |88| `resource` | Client ID |89| `ssl-required` | `none`, `external`, or `all` |90| `verify-token-audience` | Validate audience claim against `resource` |91| `credentials.secret` | Client secret (confidential clients) |9293Both kebab-case (Keycloak adapter format) and PascalCase are supported.9495## Adding Authorization (RBAC)9697```bash98dotnet add package Keycloak.AuthServices.Authorization99```100101```csharp102builder.Services.AddKeycloakAuthorization(builder.Configuration)103 .AddAuthorizationBuilder()104 .AddPolicy("AdminOnly", policy => policy.RequireRealmRoles("admin"))105 .AddPolicy("EditorOnly", policy => policy.RequireResourceRoles("editor"));106```107108## Adding Authorization Server (Resource Protection)109110```csharp111builder.Services112 .AddKeycloakAuthorization()113 .AddAuthorizationServer(builder.Configuration);114115app.MapGet("/workspaces", () => "Hello World!")116 .RequireProtectedResource("workspaces", "workspace:read");117```118119## Adding Admin SDK120121```bash122dotnet add package Keycloak.AuthServices.Sdk123```124125```csharp126builder.Services.AddKeycloakAdminHttpClient(builder.Configuration);127128app.MapGet("/users", async (IKeycloakUserClient client) =>129 await client.GetUsers("my-realm"));130```131132## Essential Patterns133134- **Configuration section**: defaults to `"Keycloak"`, override via `configSectionName` parameter135- **IHttpClientBuilder**: all HTTP clients return `IHttpClientBuilder` for resilience, handlers, etc.136- **Token management**: use `Duende.AccessTokenManagement` for service account tokens137- **OpenTelemetry**: `AddKeycloakAuthServicesInstrumentation()` for metrics and tracing138- **Aspire**: `AddKeycloakContainer("keycloak")` + `AddRealm("Test")` for local dev139140## Reference Documentation141142- [authentication.md](references/authentication.md) — JWT Bearer and OIDC setup, all overloads, adapter file config, RFC 8414 server metadata discovery143- [authorization.md](references/authorization.md) — RBAC, realm/client roles, role claims transformation, token introspection144- [organization-authorization.md](references/organization-authorization.md) — Organization-based multi-tenancy, membership requirements, parameter resolvers145- [resource-protection.md](references/resource-protection.md) — Authorization Server, Protected Resource Builder, dynamic resources, policy provider, IKeycloakAccessTokenProvider, IProtectedResourcePolicyBuilder, pluggable parameter resolvers146- [admin-sdk.md](references/admin-sdk.md) — Admin REST API (hand-written + Kiota), access token management147- [protection-api.md](references/protection-api.md) — UMA Protection API, resource/permission/policy management148- [devex.md](references/devex.md) — .NET Aspire, templates, OpenTelemetry149- [configuration.md](references/configuration.md) — All configuration options, naming conventions, adapter file150- [troubleshooting.md](references/troubleshooting.md) — Common issues, recipes, debugging