A lightweight library that simplifies ASP.NET Core API setup with pre-configured JWT Bearer authentication and Swagger/OpenAPI documentation with OAuth2 support for Keycloak (or any OpenID Connect provider).
This package eliminates boilerplate code when setting up new ASP.NET Core APIs. Instead of manually configuring JWT authentication and Swagger with OAuth security schemes, you can configure everything via appsettings.json with just two lines of code.
- JWT Bearer Authentication - Pre-configured with Authority, Audience, and HTTPS metadata settings
- Swagger/OpenAPI with OAuth2 - Auto-configured with Authorization Code flow + PKCE
- Keycloak Ready - Works out of the box with Keycloak or any OIDC provider
- Configuration-driven - All settings via
appsettings.json - Minimal API friendly - Works with both Minimal APIs and Controller-based APIs
dotnet add package BoricuaCoder.API.CoreSetupAdd the CoreSetup section to your appsettings.json:
{
"CoreSetup": {
"Jwt": {
"Authority": "https://your-keycloak.com/realms/your-realm",
"Audience": "account",
"RequireHttpsMetadata": true
},
"Swagger": {
"Enabled": true,
"Title": "My API",
"Version": "v1",
"RoutePrefix": "swagger",
"OAuth": {
"AuthorizationUrl": "https://your-keycloak.com/realms/your-realm/protocol/openid-connect/auth",
"TokenUrl": "https://your-keycloak.com/realms/your-realm/protocol/openid-connect/token",
"ClientId": "swagger-ui",
"Scopes": {
"openid": "OpenID Connect",
"profile": "User profile",
"email": "Email address"
}
}
}
}
}In your Program.cs, add the core setup services:
using BoricuaCoder.API.CoreSetup.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Add CoreSetup (JWT + Swagger with OAuth)
builder.Services.AddCoreSetup(builder.Configuration);
var app = builder.Build();
// Use CoreSetup middleware
app.UseCoreSetup();
app.MapGet("/", () => "Hello World!")
.RequireAuthorization();
app.Run();That's it! Your API now has:
- JWT Bearer authentication configured
- Swagger UI available at
/swaggerwith OAuth2 authorization (redirects to Keycloak)
| Property | Type | Default | Description |
|---|---|---|---|
Authority |
string | "" |
The URL of your identity provider (e.g., Keycloak realm URL) |
Audience |
string | "" |
The expected audience claim in the JWT token |
RequireHttpsMetadata |
bool | true |
Set to false for local development with HTTP identity providers |
| Property | Type | Default | Description |
|---|---|---|---|
Enabled |
bool | true |
Enable or disable Swagger UI |
Title |
string | "API" |
The title displayed in Swagger UI |
Version |
string | "v1" |
API version for the Swagger document |
RoutePrefix |
string | "swagger" |
URL prefix for Swagger UI (e.g., /swagger) |
OAuth |
object | OAuth2 configuration for Swagger authentication |
| Property | Type | Default | Description |
|---|---|---|---|
AuthorizationUrl |
string | "" |
OAuth2 authorization endpoint (Keycloak auth URL) |
TokenUrl |
string | "" |
OAuth2 token endpoint (Keycloak token URL) |
ClientId |
string | "" |
OAuth2 client ID registered in Keycloak |
Scopes |
object | {"openid": "OpenID Connect"} |
Available scopes (key: scope name, value: description) |
- Go to your Keycloak Admin Console
- Select your realm
- Go to Clients > Create client
- Configure the client:
- Client ID:
swagger-ui(or your preferred name) - Client authentication:
Off(public client for PKCE) - Authorization:
Off
- Client ID:
In the client settings:
| Setting | Value |
|---|---|
| Root URL | https://your-api.com |
| Valid redirect URIs | https://your-api.com/swagger/oauth2-redirect.html |
| Valid post logout redirect URIs | https://your-api.com/* |
| Web origins | https://your-api.com |
Your Keycloak URLs follow this pattern:
- Authorization URL:
https://{keycloak-host}/realms/{realm}/protocol/openid-connect/auth - Token URL:
https://{keycloak-host}/realms/{realm}/protocol/openid-connect/token - Authority (for JWT):
https://{keycloak-host}/realms/{realm}
{
"CoreSetup": {
"Jwt": {
"Authority": "http://localhost:8080/realms/dev-realm",
"Audience": "account",
"RequireHttpsMetadata": false
},
"Swagger": {
"Enabled": true,
"Title": "My API (Dev)",
"Version": "v1",
"OAuth": {
"AuthorizationUrl": "http://localhost:8080/realms/dev-realm/protocol/openid-connect/auth",
"TokenUrl": "http://localhost:8080/realms/dev-realm/protocol/openid-connect/token",
"ClientId": "swagger-ui-dev",
"Scopes": {
"openid": "OpenID Connect",
"profile": "User profile",
"email": "Email address"
}
}
}
}
}{
"CoreSetup": {
"Jwt": {
"Authority": "https://auth.mycompany.com/realms/prod-realm",
"Audience": "account",
"RequireHttpsMetadata": true
},
"Swagger": {
"Enabled": false
}
}
}- Run your API
- Navigate to
https://localhost:{port}/swagger - Click the Authorize button
- Select the scopes you want to request
- Click Authorize - you'll be redirected to Keycloak
- Enter your credentials in Keycloak
- After successful login, you'll be redirected back to Swagger with the token applied
- JWT Bearer authentication scheme as default
- Authorization services registered
UseAuthentication()andUseAuthorization()middleware added
- OpenAPI document generation
- OAuth2 Authorization Code flow with PKCE
- Configurable scopes for user selection
- Swagger UI with OAuth client configuration
- .NET 10.0 or later
- ASP.NET Core application
- Keycloak or any OpenID Connect provider
MIT