Skip to content

Authentication

JWT Bearer validation, claims transformation for Keycloak, Entra ID, and AWS Cognito, and OIDC back-channel logout — all wired through the module system.

  • DirectoryGranit.Authentication.JwtBearer/ Generic JWT Bearer, back-channel logout
    • Granit.Authentication.Keycloak Keycloak claims transformation
    • Granit.Authentication.EntraId Entra ID roles parsing
    • Granit.Authentication.Cognito Cognito groups → roles
PackageRoleDepends on
Granit.Authentication.JwtBearerJWT Bearer middleware, back-channel logoutGranit.Security
Granit.Authentication.KeycloakKeycloak claims transformationGranit.Authentication.JwtBearer
Granit.Authentication.EntraIdEntra ID roles parsingGranit.Authentication.JwtBearer
Granit.Authentication.CognitoCognito groups → rolesGranit.Authentication.JwtBearer
[DependsOn(typeof(GranitAuthenticationKeycloakModule))]
public class AppModule : GranitModule { }
{
"Authentication": {
"Authority": "https://keycloak.example.com/realms/my-realm",
"Audience": "my-client"
},
"Keycloak": {
"ClientId": "my-client",
"AdminRole": "admin",
"RoleClaimsSource": "realm_access"
}
}

GranitJwtBearerModule registers:

  • ASP.NET Core JWT Bearer authentication
  • CurrentUserServiceICurrentUserService implementation extracting claims from HttpContext
  • IRevokedSessionStore — distributed cache-backed session revocation
{
"Authentication": {
"Authority": "https://idp.example.com/realms/my-realm",
"Audience": "my-client",
"RequireHttpsMetadata": true,
"NameClaimType": "sub",
"BackChannelLogout": {
"Enabled": true,
"EndpointPath": "/auth/back-channel-logout",
"SessionRevocationTtl": "01:00:00"
}
}
}
PropertyDefaultDescription
AuthorityOIDC issuer URL (required)
AudienceExpected aud claim (required)
RequireHttpsMetadatatrueEnforce HTTPS for metadata endpoint
NameClaimType"sub"Claim used as user identifier
BackChannelLogout.EnabledfalseEnable OIDC back-channel logout
BackChannelLogout.EndpointPath"/auth/back-channel-logout"Endpoint path
BackChannelLogout.SessionRevocationTtl"01:00:00"How long revoked sessions are remembered

Provider-agnostic implementation of the OIDC Back-Channel Logout specification. When the IdP sends a logout token, the session is revoked in distributed cache.

// In OnApplicationInitialization
app.MapBackChannelLogout(); // POST /auth/back-channel-logout (anonymous)

The endpoint validates the logout token signature against the IdP’s JWKS, extracts the sid claim, and stores it in IDistributedCache with key granit:revoked-session:{sid}.

Subsequent requests with a revoked sid are rejected by the JWT Bearer events handler.

GranitAuthenticationKeycloakModule post-configures JWT Bearer with Keycloak-specific behavior:

  • Extracts roles from realm_access.roles or resource_access.{clientId}.roles
  • Maps them to standard ClaimTypes.Role claims
  • Registers an "Admin" authorization policy
// Keycloak JWT payload (simplified)
{
"realm_access": {
"roles": ["admin", "doctor"]
},
"resource_access": {
"my-client": {
"roles": ["manage-patients"]
}
}
}
// After transformation → ClaimTypes.Role: "admin", "doctor", "manage-patients"

GranitAuthenticationEntraIdModule post-configures JWT Bearer with Entra ID-specific behavior:

  • Extracts roles from the v1.0 roles claim and the v2.0 wids claim
  • Maps them to standard ClaimTypes.Role claims

GranitAuthenticationCognitoModule post-configures JWT Bearer with Cognito-specific behavior:

  • Extracts groups from the cognito:groups claim (multiple claims with same type)
  • Maps them to standard ClaimTypes.Role claims
// Cognito JWT payload — groups appear as repeated claims
// "cognito:groups": "admin"
// "cognito:groups": "doctors"
// After transformation → ClaimTypes.Role: "admin", "doctors"
CategoryKey typesPackage
ModulesGranitJwtBearerModule, GranitAuthenticationKeycloakModule, GranitAuthenticationEntraIdModule, GranitAuthenticationCognitoModule
AbstractionsCurrentUserService, IRevokedSessionStore, BackChannelLogoutTokenValidatorGranit.Authentication.JwtBearer
ClaimsKeycloakClaimsTransformationGranit.Authentication.Keycloak
ClaimsEntraIdClaimsTransformationGranit.Authentication.EntraId
ClaimsCognitoClaimsTransformationGranit.Authentication.Cognito
OptionsJwtBearerAuthOptions, KeycloakOptions, CognitoOptions
ExtensionsAddGranitJwtBearer(), AddGranitKeycloak(), AddGranitCognito(), MapBackChannelLogout()
  • Authorization — RBAC permissions, dynamic policy provider
  • Security — core abstractions (ICurrentUserService, ActorKind)
  • Identity — user management, Keycloak Admin API, user cache