#### [Abblix\.SecurityEvents](https://www.abblix.com/en/docs/api/abblix-securityevents 'index')
### [Abblix\.SecurityEvents\.Validation](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation 'Abblix\.SecurityEvents\.Validation')

## ISecurityEventTokenValidator Interface

One check in the validation pipeline\. The validator runs steps in order and stops at the first
error, so a step sees only tokens that survived everything before it\.

```csharp
public interface ISecurityEventTokenValidator
```

Derived  
↳ [ForbidNonceStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.BackChannelLogout.Steps.ForbidNonceStep 'Abblix\.SecurityEvents\.BackChannelLogout\.Steps\.ForbidNonceStep')  
↳ [LogoutEventStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.BackChannelLogout.Steps.LogoutEventStep 'Abblix\.SecurityEvents\.BackChannelLogout\.Steps\.LogoutEventStep')  
↳ [LogoutTokenExpiryStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.BackChannelLogout.Steps.LogoutTokenExpiryStep 'Abblix\.SecurityEvents\.BackChannelLogout\.Steps\.LogoutTokenExpiryStep')  
↳ [LogoutTokenTypeStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.BackChannelLogout.Steps.LogoutTokenTypeStep 'Abblix\.SecurityEvents\.BackChannelLogout\.Steps\.LogoutTokenTypeStep')  
↳ [SubjectOrSessionStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.BackChannelLogout.Steps.SubjectOrSessionStep 'Abblix\.SecurityEvents\.BackChannelLogout\.Steps\.SubjectOrSessionStep')  
↳ [CompositeSecurityEventTokenValidator](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.CompositeSecurityEventTokenValidator 'Abblix\.SecurityEvents\.Validation\.CompositeSecurityEventTokenValidator')  
↳ [ISecurityCriticalValidator](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.ISecurityCriticalValidator 'Abblix\.SecurityEvents\.Validation\.ISecurityCriticalValidator')  
↳ [AudienceStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.AudienceStep 'Abblix\.SecurityEvents\.Validation\.Steps\.AudienceStep')  
↳ [EventsPresenceStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.EventsPresenceStep 'Abblix\.SecurityEvents\.Validation\.Steps\.EventsPresenceStep')  
↳ [ExpAbsenceStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.ExpAbsenceStep 'Abblix\.SecurityEvents\.Validation\.Steps\.ExpAbsenceStep')  
↳ [IssuedAtWindowStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.IssuedAtWindowStep 'Abblix\.SecurityEvents\.Validation\.Steps\.IssuedAtWindowStep')  
↳ [IssuerAllowlistStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.IssuerAllowlistStep 'Abblix\.SecurityEvents\.Validation\.Steps\.IssuerAllowlistStep')  
↳ [JwtIdPresenceStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.JwtIdPresenceStep 'Abblix\.SecurityEvents\.Validation\.Steps\.JwtIdPresenceStep')  
↳ [ParseStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.ParseStep 'Abblix\.SecurityEvents\.Validation\.Steps\.ParseStep')  
↳ [PayloadDeserializationStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.PayloadDeserializationStep 'Abblix\.SecurityEvents\.Validation\.Steps\.PayloadDeserializationStep')  
↳ [SignatureStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.SignatureStep 'Abblix\.SecurityEvents\.Validation\.Steps\.SignatureStep')  
↳ [TimeOfEventStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.TimeOfEventStep 'Abblix\.SecurityEvents\.Validation\.Steps\.TimeOfEventStep')  
↳ [TypHeaderStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.Steps.TypHeaderStep 'Abblix\.SecurityEvents\.Validation\.Steps\.TypHeaderStep')

### Remarks
A step's contract, beyond the signature: declare the facts your safety depends on through
[Require\(SecurityEventTokenValidationStates\)](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Require(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates) 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.Require\(Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationStates\)') before reading them, record what you
proved through [Establish\(SecurityEventTokenValidationStates\)](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Establish(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates) 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.Establish\(Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationStates\)'), and stay free of
side effects \- validation answers "is this token acceptable", and anything that changes the
world on the strength of that answer \(registering a replay identifier, invalidating a cache\)
belongs after the verdict, in the consumer\. That split is why replay protection is not a step:
registering a "jti" is a mutation, and a pipeline that mutated on a token later steps might
still reject would need an undo\.

The return type is [System\.Threading\.Tasks\.ValueTask&lt;&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask-1 'System\.Threading\.Tasks\.ValueTask\`1') deliberately: all but one of the default
steps answer synchronously - only signature verification performs I/O, for key retrieval -
and the pipeline calls every step on every token, so a [System\.Threading\.Tasks\.Task&lt;&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1') here would
allocate once per synchronous step per token for nothing. The usual ValueTask hazard, a
second await, has no doorway: the composite and the guard each await a step exactly once.
### Methods

## ISecurityEventTokenValidator\.ValidateAsync\(SecurityEventTokenValidationContext, CancellationToken\) Method {#Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator.ValidateAsync(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext,System.Threading.CancellationToken)}

Checks the token in flight\.

```csharp
System.Threading.Tasks.ValueTask<Abblix.SecurityEvents.Validation.SecurityEventTokenValidationError?> ValidateAsync(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext context, System.Threading.CancellationToken cancellationToken);
```
#### Parameters

###### `context` [SecurityEventTokenValidationContext](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext') {#Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator.ValidateAsync(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext,System.Threading.CancellationToken).context}

The state accumulated by earlier steps\.

###### `cancellationToken` [System\.Threading\.CancellationToken](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken 'System\.Threading\.CancellationToken') {#Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator.ValidateAsync(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext,System.Threading.CancellationToken).cancellationToken}

Cancels I/O the step performs, such as key retrieval\.

#### Returns
[System\.Threading\.Tasks\.ValueTask&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask-1 'System\.Threading\.Tasks\.ValueTask\`1')[SecurityEventTokenValidationError](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationError 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationError')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask-1 'System\.Threading\.Tasks\.ValueTask\`1')  
Null to pass the token on; an error to stop the pipeline with that verdict\.
