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

## IssuedAtWindowStep Class

Requires the "iat" claim to be present \- it is REQUIRED \(RFC 8417 Section 2\.2\) \- and within
the receiver's freshness window on either side of its clock\.

```csharp
public sealed class IssuedAtWindowStep : Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator
```

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

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

### Remarks
A SET records history, so freshness is not about token expiry \- a SET deliberately has no
"exp" \- but about bounding what a replay cache must remember: a token older than the window
fails here, so the cache can evict identifiers older than the window instead of keeping all of
them forever\. The same tolerance forgives clock skew for a token from the near future, the
caution RFC 8417 Section 5\.3 raises about treating timestamps as exact across distributed
systems\.
### Constructors

## IssuedAtWindowStep\(TimeProvider\) Constructor {#Abblix.SecurityEvents.Validation.Steps.IssuedAtWindowStep.IssuedAtWindowStep(System.TimeProvider)}

Requires the "iat" claim to be present \- it is REQUIRED \(RFC 8417 Section 2\.2\) \- and within
the receiver's freshness window on either side of its clock\.

```csharp
public IssuedAtWindowStep(System.TimeProvider clock);
```
#### Parameters

###### `clock` [System\.TimeProvider](https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider 'System\.TimeProvider') {#Abblix.SecurityEvents.Validation.Steps.IssuedAtWindowStep.IssuedAtWindowStep(System.TimeProvider).clock}

The receiver's clock; a test hands in a fake to pin the window\.

### Remarks
A SET records history, so freshness is not about token expiry \- a SET deliberately has no
"exp" \- but about bounding what a replay cache must remember: a token older than the window
fails here, so the cache can evict identifiers older than the window instead of keeping all of
them forever\. The same tolerance forgives clock skew for a token from the near future, the
caution RFC 8417 Section 5\.3 raises about treating timestamps as exact across distributed
systems\.
### Methods

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

Checks the token in flight\.

```csharp
public 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.Steps.IssuedAtWindowStep.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.Steps.IssuedAtWindowStep.ValidateAsync(Abblix.SecurityEvents.Validation.SecurityEventTokenValidationContext,System.Threading.CancellationToken).cancellationToken}

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

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

#### 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\.
