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

## ValidationProfile Class

One named validation profile under construction: the editing surface
[AddSecurityEventValidationProfile\(this IServiceCollection, object, Action&lt;ValidationProfile&gt;\)](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Infrastructure.ServiceCollectionExtensions#Abblix.SecurityEvents.Infrastructure.ServiceCollectionExtensions.AddSecurityEventValidationProfile(thisMicrosoft.Extensions.DependencyInjection.IServiceCollection,object,System.Action_Abblix.SecurityEvents.Infrastructure.ValidationProfile_) 'Abblix\.SecurityEvents\.Infrastructure\.ServiceCollectionExtensions\.AddSecurityEventValidationProfile\(this Microsoft\.Extensions\.DependencyInjection\.IServiceCollection, object, System\.Action\<Abblix\.SecurityEvents\.Infrastructure\.ValidationProfile\>\)') hands to its
configure delegate\.

```csharp
public sealed class ValidationProfile
```

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

### Remarks
A profile exists because two consumers of security event tokens in one host can demand
CONTRADICTORY things of the same claim \- Back\-Channel Logout requires `exp` where a Shared
Signals SET forbids it, and each pins its own `typ` \- so no single pipeline can serve both\.
A profile is a keyed family one consumer owns outright: it lists its own steps in the order they
judge a token, declares its own critical steps, records its own allowances, and resolves its
validator by its key, while every other profile stays exactly as its owner composed it\. There is
no unnamed profile to fall back to: naming is what makes ownership visible\.
### Properties

## ValidationProfile\.Key Property {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Key}

The key this profile's validator resolves under\.

```csharp
public object Key { get; }
```

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

## ValidationProfile\.Steps Property {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Steps}

The live cursor over this profile's steps, in execution order\. Plain descriptors are
accepted \- the cursor keys them to this profile on insert \- and edits here touch no other
profile\.

```csharp
public Abblix.DependencyInjection.IComposition<Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator> Steps { get; }
```

#### Property Value
[Abblix\.DependencyInjection\.IComposition&lt;](https://www.abblix.com/en/docs/api/abblix-dependencyinjection/Abblix.DependencyInjection.IComposition_TInterface_ 'Abblix\.DependencyInjection\.IComposition\`1')[ISecurityEventTokenValidator](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator 'Abblix\.SecurityEvents\.Validation\.ISecurityEventTokenValidator')[&gt;](https://www.abblix.com/en/docs/api/abblix-dependencyinjection/Abblix.DependencyInjection.IComposition_TInterface_ 'Abblix\.DependencyInjection\.IComposition\`1')

### Remarks
Reading this composes the profile, which is why it is a property with a body rather than
one assigned in the constructor: a cursor is a view of a composed family, and a profile is
composed once it has stopped being listed\. Listing through [Use&lt;TStep&gt;\(\)](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Infrastructure.ValidationProfile#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Use_TStep_() 'Abblix\.SecurityEvents\.Infrastructure\.ValidationProfile\.Use\<TStep\>\(\)') before
the first read is therefore ordinary, and editing after it is ordinary too \- what cannot
happen is composing an empty family, since composition of nothing is a no\-op that would
leave the profile with no validator at all\.
### Methods

## ValidationProfile\.AddCriticalStep\<TStep\>\(\) Method {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AddCriticalStep_TStep_()}

Declares [TStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Infrastructure.ValidationProfile#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AddCriticalStep_TStep_().TStep 'Abblix\.SecurityEvents\.Infrastructure\.ValidationProfile\.AddCriticalStep\<TStep\>\(\)\.TStep') as a step THIS profile may not lose without an
allowance on record\.

```csharp
public Abblix.SecurityEvents.Infrastructure.ValidationProfile AddCriticalStep<TStep>()
    where TStep : class, Abblix.SecurityEvents.Validation.ISecurityCriticalValidator;
```
#### Type parameters

###### `TStep` {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AddCriticalStep_TStep_().TStep}

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

### Remarks
Scoped rather than global on purpose: a package's step is critical for the profile that
carries it, and a global declaration would make every OTHER profile's guard demand a step
that was never meant for it\.

## ValidationProfile\.AllowInsecureValidation\<TStep\>\(string\) Method {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AllowInsecureValidation_TStep_(string)}

Acknowledges that this profile drops or replaces [TStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Infrastructure.ValidationProfile#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AllowInsecureValidation_TStep_(string).TStep 'Abblix\.SecurityEvents\.Infrastructure\.ValidationProfile\.AllowInsecureValidation\<TStep\>\(string\)\.TStep'), a
security\-critical default, and why\. The guard logs every allowance at first resolve, so the
weakening stays visible in the boot log\.

```csharp
public Abblix.SecurityEvents.Infrastructure.ValidationProfile AllowInsecureValidation<TStep>(string reason)
    where TStep : class, Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator;
```
#### Type parameters

###### `TStep` {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AllowInsecureValidation_TStep_(string).TStep}

The security\-critical default this profile does not carry\.
#### Parameters

###### `reason` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.AllowInsecureValidation_TStep_(string).reason}

Why this profile is right not to carry it\.

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

### Remarks
The allowance names the step it excuses, and excuses only that one\. An allowance that
excused "some critical step" would excuse every future one too: a profile carrying two
reasoned departures would silently absorb a third, added to the core long after anyone read
this profile \- and the third could be the step that keeps an attacker\-named issuer from
deciding which keys are fetched\.

## ValidationProfile\.Use\<TStep\>\(\) Method {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Use_TStep_()}

Appends [TStep](https://www.abblix.com/en/docs/api/abblix-securityevents/Abblix.SecurityEvents.Infrastructure.ValidationProfile#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Use_TStep_().TStep 'Abblix\.SecurityEvents\.Infrastructure\.ValidationProfile\.Use\<TStep\>\(\)\.TStep') to the end of this profile's pipeline\.

```csharp
public Abblix.SecurityEvents.Infrastructure.ValidationProfile Use<TStep>()
    where TStep : class, Abblix.SecurityEvents.Validation.ISecurityEventTokenValidator;
```
#### Type parameters

###### `TStep` {#Abblix.SecurityEvents.Infrastructure.ValidationProfile.Use_TStep_().TStep}

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

### Remarks
A profile states its pipeline by listing it, so the order a token is judged in is the order
written here rather than a baseline the reader has to know plus the edits made to it\. The
list is not what makes a profile safe \- the guard does that, by demanding an allowance for
every security\-critical default the list leaves out \- so leaving one out is a decision that
has to be written down, whether it was made deliberately or by forgetting\.
