Claims Structure
Understanding JWT claims in AuthScape tokens.
AuthScape tokens contain claims that provide identity and authorization information.
Standard Claims
OpenID Connect standard claims:
json
{"sub": "12345","iss": "https://auth.example.com","aud": "web-app","exp": 1704067200,"iat": 1704063600,"email": "user@example.com","email_verified": true,"given_name": "John","family_name": "Doe"}
AuthScape Custom Claims
Additional claims for multi-tenant applications:
json
{"sub": "12345","username": "user@example.com","firstName": "John","lastName": "Doe","companyId": "1","companyName": "Acme Corp","locationId": "1","locationName": "Headquarters","usersRoles": "[{\"Id\":1,\"Name\":\"Admin\"}]","userPermissions": "[{\"Id\":\"guid\",\"Name\":\"CanEdit\"}]"}
Claim Destinations
Configure which claims go to access token vs ID token:
csharp
static IEnumerable<string> GetDestinations(Claim claim){switch (claim.Type){case Claims.Name:case Claims.Email:yield return Destinations.AccessToken;if (claim.Subject.HasScope(Scopes.Profile))yield return Destinations.IdentityToken;break;case Claims.Role:yield return Destinations.AccessToken;if (claim.Subject.HasScope(Scopes.Roles))yield return Destinations.IdentityToken;break;case "companyId":case "locationId":yield return Destinations.AccessToken;break;default:yield return Destinations.AccessToken;break;}}
Reading Claims in Backend
csharp
[Authorize][HttpGet]public IActionResult GetUserInfo(){var userId = User.FindFirst(Claims.Subject)?.Value;var email = User.FindFirst(Claims.Email)?.Value;var companyId = User.FindFirst("companyId")?.Value;// Parse JSON claimsvar rolesJson = User.FindFirst("usersRoles")?.Value;var roles = JsonSerializer.Deserialize<List<RoleInfo>>(rolesJson);return Ok(new { userId, email, companyId, roles });}
Reading Claims in Frontend
javascript
function parseJwt(token) {const base64Url = token.split('.')[1];const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');return JSON.parse(atob(base64));}const token = Cookies.get('access_token');const claims = parseJwt(token);console.log(claims.sub); // User IDconsole.log(claims.email); // Emailconsole.log(claims.companyId); // Company ID
Adding Custom Claims
csharp
public class CustomClaimsPrincipalFactory : UserClaimsPrincipalFactory<AppUser, Role>{public override async Task<ClaimsPrincipal> CreateAsync(AppUser user){var principal = await base.CreateAsync(user);var identity = (ClaimsIdentity)principal.Identity;// Add custom claimsidentity.AddClaim(new Claim("companyId", user.CompanyId?.ToString() ?? ""));identity.AddClaim(new Claim("locationId", user.LocationId?.ToString() ?? ""));return principal;}}