Configure cookie-based OIDC authentication with Keycloak for affolterNET.Web.Bff. Use when setting up login/logout, token refresh, or Keycloak integration.
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: keycloak-auth
description: Configure cookie-based OIDC authentication with Keycloak for affolterNET.Web.Bff. Use when setting up login/logout, token refresh, or Keycloak integration.
---
# Keycloak Authentication
Configure cookie-based OIDC authentication with Keycloak.
For complete reference, see [Library Guide](../../LIBRARY_GUIDE.md).
## Quick Start
### appsettings.json
```json
{
"affolterNET": {
"Web": {
"Auth": {
"Provider": {
"Authority": "https://keycloak.example.com/realms/myrealm",
"ClientId": "my-bff-client",
"ClientSecret": "your-client-secret"
},
"CookieAuth": {
"CookieName": ".MyApp.Auth",
"ExpireTimeSpan": "01:00:00"
}
},
"BffOptions": {
"AuthMode": "Authenticate"
}
}
}
}
```
## Authentication Modes
| Mode | Description |
|------|-------------|
| `None` | No authentication required |
| `Authenticate` | Valid session required, no permission checks |
| `Authorize` | Valid session + Keycloak RPT permissions required |
## Login/Logout Endpoints
The BFF provides these authentication endpoints:
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/bff/account/login` | GET | Initiates OIDC login flow |
| `/bff/account/logout` | GET/POST | Logs out user |
| `/bff/account/user` | GET | Returns current user info |
### Login with Return URL
```
/bff/account/login?returnUrl=/dashboard
```
## Configuration Options
### AuthProviderOptions
| Property | Description |
|----------|-------------|
| `Authority` | Keycloak realm URL |
| `ClientId` | OIDC client identifier |
| `ClientSecret` | OIDC client secret |
### CookieAuthOptions
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `CookieName` | string | `.AspNetCore.Auth` | Authentication cookie name |
| `ExpireTimeSpan` | TimeSpan | `01:00:00` | Cookie expiration |
| `SlidingExpiration` | bool | `true` | Extend cookie on activity |
## Token Refresh
The `RefreshTokenMiddleware` automatically refreshes tokens:
- Checks token expiration before each request
- Refreshes when < 10 seconds until expiration
- Uses semaphore lock to prevent concurrent refreshes
- Signs out user on refresh failure
## SPA Integration
The BFF returns 401 instead of redirecting to Keycloak:
```typescript
// Handle 401 in your SPA
if (response.status === 401) {
window.location.href = '/bff/account/login?returnUrl=' +
encodeURIComponent(window.location.pathname);
}
```
## Troubleshooting
### Login redirects to wrong URL
- Verify `Authority` URL is correct
- Check Keycloak client redirect URIs include your app
- Ensure cookies are being set (check SameSite settings)
### Token refresh fails
- Check refresh token hasn't expired
- Verify Keycloak client has offline_access scope
- Review Keycloak session timeout settings
### Logout doesn't work
- Ensure Keycloak client has logout redirect URI configured
- Check if front-channel logout is enabled
No comments yet. Be the first to comment!