#### [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')

## SecurityEventTokenValidationContext Class

The state one token accumulates on its way through the pipeline: each step reads what earlier
steps established and writes what it proved\.

```csharp
public sealed class SecurityEventTokenValidationContext
```

Inheritance [System\.Object](https://learn.microsoft.com/en-us/dotnet/api/system.object 'System\.Object') → SecurityEventTokenValidationContext

### Remarks
The context distinguishes the UNVERIFIED reading of the token from the verified one on
purpose\. [UnverifiedHeader](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedHeader 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.UnverifiedHeader') and [UnverifiedPayload](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedPayload 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.UnverifiedPayload') are what parsing
alone yields \- enough for the cheap rejections that should not cost a signature check \- while
[Token](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Token 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.Token') exists only after the signature step, so a later step reaching for the
trusted token cannot accidentally read the untrusted one: they are different properties, and
the trusted one is null until trust exists\.
### Constructors

## SecurityEventTokenValidationContext\(string, SecurityEventTokenValidationOptions\) Constructor {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.SecurityEventTokenValidationContext(string,Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions)}

The state one token accumulates on its way through the pipeline: each step reads what earlier
steps established and writes what it proved\.

```csharp
public SecurityEventTokenValidationContext(string compactToken, Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions options);
```
#### Parameters

###### `compactToken` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.SecurityEventTokenValidationContext(string,Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions).compactToken}

The token as received, in compact serialization\.

###### `options` [SecurityEventTokenValidationOptions](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationOptions') {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.SecurityEventTokenValidationContext(string,Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions).options}

What this run expects of the token\.

### Remarks
The context distinguishes the UNVERIFIED reading of the token from the verified one on
purpose\. [UnverifiedHeader](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedHeader 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.UnverifiedHeader') and [UnverifiedPayload](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedPayload 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.UnverifiedPayload') are what parsing
alone yields \- enough for the cheap rejections that should not cost a signature check \- while
[Token](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Token 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationContext\.Token') exists only after the signature step, so a later step reaching for the
trusted token cannot accidentally read the untrusted one: they are different properties, and
the trusted one is null until trust exists\.
### Properties

## SecurityEventTokenValidationContext\.CompactToken Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.CompactToken}

The token as received\. Steps performing cryptography read this, never a re\-serialization
of parsed parts: the signature covers these exact bytes\.

```csharp
public string CompactToken { get; }
```

#### Property Value
[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')

## SecurityEventTokenValidationContext\.EventPayloads Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.EventPayloads}

The typed event payloads, keyed by event identifier: set by the payload deserialization
step\.

```csharp
public System.Collections.Generic.IReadOnlyDictionary<string,Abblix.SecurityEvents.Events.IEventPayload>? EventPayloads { get; set; }
```

#### Property Value
[System\.Collections\.Generic\.IReadOnlyDictionary&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlydictionary-2 'System\.Collections\.Generic\.IReadOnlyDictionary\`2')[System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String')[,](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlydictionary-2 'System\.Collections\.Generic\.IReadOnlyDictionary\`2')[IEventPayload](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Events.IEventPayload 'Abblix\.SecurityEvents\.Events\.IEventPayload')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlydictionary-2 'System\.Collections\.Generic\.IReadOnlyDictionary\`2')

## SecurityEventTokenValidationContext\.Options Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Options}

What this run expects of the token\.

```csharp
public Abblix.SecurityEvents.Validation.SecurityEventTokenValidationOptions Options { get; }
```

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

## SecurityEventTokenValidationContext\.State Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.State}

The facts established so far\.

```csharp
public Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates State { get; }
```

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

## SecurityEventTokenValidationContext\.Token Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Token}

The validated token: set by the signature step, null until then\. From here the claims are
the issuer's words\.

```csharp
public Abblix.SecurityEvents.SecurityEventToken? Token { get; set; }
```

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

## SecurityEventTokenValidationContext\.UnverifiedHeader Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedHeader}

The token's header as parsed, before any signature check\. Shape, not authorship\.

```csharp
public Abblix.Jwt.JsonWebTokenHeader? UnverifiedHeader { get; set; }
```

#### Property Value
[JsonWebTokenHeader](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.JsonWebTokenHeader 'Abblix\.Jwt\.JsonWebTokenHeader')

## SecurityEventTokenValidationContext\.UnverifiedPayload Property {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.UnverifiedPayload}

The token's claims as parsed, before any signature check\. Shape, not authorship\.

```csharp
public Abblix.Jwt.JsonWebTokenPayload? UnverifiedPayload { get; set; }
```

#### Property Value
[JsonWebTokenPayload](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.JsonWebTokenPayload 'Abblix\.Jwt\.JsonWebTokenPayload')
### Methods

## SecurityEventTokenValidationContext\.Establish\(SecurityEventTokenValidationStates\) Method {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Establish(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates)}

Records a fact this step has established\.

```csharp
public void Establish(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates state);
```
#### Parameters

###### `state` [SecurityEventTokenValidationStates](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationStates') {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Establish(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates).state}

The flag to set\.

## SecurityEventTokenValidationContext\.Require\(SecurityEventTokenValidationStates\) Method {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Require(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates)}

Declares the facts this step's safety depends on, failing loudly when the pipeline was
composed so that they are not yet established\.

```csharp
public void Require(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates required);
```
#### Parameters

###### `required` [SecurityEventTokenValidationStates](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates 'Abblix\.SecurityEvents\.Validation\.SecurityEventTokenValidationStates') {#Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext.Require(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationStates).required}

The facts that must already be established\.

#### Exceptions

[System\.InvalidOperationException](https://learn.microsoft.com/en-us/dotnet/api/system.invalidoperationexception 'System\.InvalidOperationException')  
A required fact is not established\.

### Remarks
This is the ordering contract of the pipeline\. A composition that, say, deserializes event
payloads before the signature step \- parsing attacker\-controlled input with the expensive
machinery \- dies on its first run with the missing precondition named, instead of running
for months with a check silently skipped\.
