#### [Abblix\.Oidc\.Server](https://www.abblix.com/en/docs/api/abblix-oidc-server 'index')
### [Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests')

## IAuthorizationDetailValidator Interface

Validates a single RFC 9396 authorization\_details entry whose `type` value matches the
implementation\. Hosts register one implementation per supported `type` via
[AddAuthorizationDetailValidator&lt;TValidator&gt;\(this IServiceCollection, string\)](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.ServiceCollectionExtensions#Abblix.Oidc.Server.Features.RichAuthorizationRequests.ServiceCollectionExtensions.AddAuthorizationDetailValidator_TValidator_(thisMicrosoft.Extensions.DependencyInjection.IServiceCollection,string) 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.ServiceCollectionExtensions\.AddAuthorizationDetailValidator\<TValidator\>\(this Microsoft\.Extensions\.DependencyInjection\.IServiceCollection, string\)'); the
composite [IAuthorizationDetailsPolicy](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailsPolicy 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.IAuthorizationDetailsPolicy') dispatches each request entry to
the implementation keyed by the entry's `type` value\.

```csharp
public interface IAuthorizationDetailValidator
```

### Remarks
The library ships no concrete implementations of this interface — each authorization\-detail
type \(e\.g\. `payment_initiation`, `consent`, OpenID4VC presentation schemas\) demands
its own per\-type schema and is contributed by the host or a separate package\. RFC 9396 §5
requires the AS to refuse any entry whose `type` is unknown; with zero implementations
registered, every RAR\-bearing request is rejected with `invalid_authorization_details`
and the server still boots cleanly\.
### Properties

## IAuthorizationDetailValidator\.Type Property {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.Type}

The authorization\-detail `type` value this validator handles\. Used as the DI key
under which the implementation is registered and looked up at request time\.

```csharp
string Type { get; }
```

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

## IAuthorizationDetailValidator\.BuildConsentDescriptorAsync\(AuthorizationDetail, ClientInfo, CancellationToken\) Method {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.BuildConsentDescriptorAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken)}

Optional: produces a host\-renderable [AuthorizationDetailDescriptor](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.AuthorizationDetailDescriptor 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.AuthorizationDetailDescriptor') describing
what consenting to this entry authorises, so the consent UI can render a meaningful screen
instead of a raw JSON dump\. Default returns `null`; hosts that opt out simply fall back
to displaying [Json](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail#Abblix.Jwt.AuthorizationDetail.Json 'Abblix\.Jwt\.AuthorizationDetail\.Json')\. Validators that override this should
extract the structured payload from [Json](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail#Abblix.Jwt.AuthorizationDetail.Json 'Abblix\.Jwt\.AuthorizationDetail\.Json') and project it to
the descriptor's Title / Summary / Details shape\.

```csharp
System.Threading.Tasks.Task<Abblix.Oidc.Server.Features.RichAuthorizationRequests.AuthorizationDetailDescriptor?> BuildConsentDescriptorAsync(Abblix.Jwt.AuthorizationDetail detail, Abblix.Oidc.Server.Features.ClientInformation.ClientInfo client, System.Threading.CancellationToken cancellationToken);
```
#### Parameters

###### `detail` [AuthorizationDetail](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail 'Abblix\.Jwt\.AuthorizationDetail') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.BuildConsentDescriptorAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).detail}

The entry to describe\. Already passed
            [ValidateAsync\(AuthorizationDetail, ClientInfo, CancellationToken\)](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.ValidateAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken) 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.IAuthorizationDetailValidator\.ValidateAsync\(Abblix\.Jwt\.AuthorizationDetail, Abblix\.Oidc\.Server\.Features\.ClientInformation\.ClientInfo, System\.Threading\.CancellationToken\)'), so the per\-type schema is satisfied\.

###### `client` [ClientInfo](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ClientInformation.ClientInfo 'Abblix\.Oidc\.Server\.Features\.ClientInformation\.ClientInfo') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.BuildConsentDescriptorAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).client}

The requesting client, for descriptions that vary by client metadata
            \(e\.g\. branding, locale\)\.

###### `cancellationToken` [System\.Threading\.CancellationToken](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken 'System\.Threading\.CancellationToken') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.BuildConsentDescriptorAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).cancellationToken}

Cancellation token\.

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[AuthorizationDetailDescriptor](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.AuthorizationDetailDescriptor 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.AuthorizationDetailDescriptor')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
The descriptor on success; `null` when no structured description is
            available and the host should fall back to a JSON\-dump rendering\.

## IAuthorizationDetailValidator\.ValidateAsync\(AuthorizationDetail, ClientInfo, CancellationToken\) Method {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.ValidateAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken)}

Validates a single authorization\-detail entry against this validator's per\-type schema
and any per\-client policy the implementation chooses to enforce\.

```csharp
System.Threading.Tasks.Task<Abblix.Utils.Result<Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Common.OidcError>> ValidateAsync(Abblix.Jwt.AuthorizationDetail detail, Abblix.Oidc.Server.Features.ClientInformation.ClientInfo client, System.Threading.CancellationToken token);
```
#### Parameters

###### `detail` [AuthorizationDetail](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail 'Abblix\.Jwt\.AuthorizationDetail') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.ValidateAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).detail}

The entry to validate\. Its [Type](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail#Abblix.Jwt.AuthorizationDetail.Type 'Abblix\.Jwt\.AuthorizationDetail\.Type')
            matches this validator's [Type](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.Type 'Abblix\.Oidc\.Server\.Features\.RichAuthorizationRequests\.IAuthorizationDetailValidator\.Type'); the per\-type schema lives in the raw
            [Json](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail#Abblix.Jwt.AuthorizationDetail.Json 'Abblix\.Jwt\.AuthorizationDetail\.Json') object alongside the RFC 9396 §2\.2
            standardised members where applicable\.

###### `client` [ClientInfo](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ClientInformation.ClientInfo 'Abblix\.Oidc\.Server\.Features\.ClientInformation\.ClientInfo') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.ValidateAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).client}

The client that submitted the request, for policy decisions that
            depend on per\-client allowlists or registered metadata\.

###### `token` [System\.Threading\.CancellationToken](https://learn.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken 'System\.Threading\.CancellationToken') {#Abblix.Oidc.Server.Features.RichAuthorizationRequests.IAuthorizationDetailValidator.ValidateAsync(Abblix.Jwt.AuthorizationDetail,Abblix.Oidc.Server.Features.ClientInformation.ClientInfo,System.Threading.CancellationToken).token}

Cancellation token\.

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[Abblix\.Utils\.Result&lt;](https://learn.microsoft.com/en-us/dotnet/api/abblix.utils.result-2 'Abblix\.Utils\.Result\`2')[AuthorizationDetail](https://www.abblix.com/en/docs/api/abblix-jwt/Abblix.Jwt.AuthorizationDetail 'Abblix\.Jwt\.AuthorizationDetail')[,](https://learn.microsoft.com/en-us/dotnet/api/abblix.utils.result-2 'Abblix\.Utils\.Result\`2')[OidcError](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Common.OidcError 'Abblix\.Oidc\.Server\.Common\.OidcError')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/abblix.utils.result-2 'Abblix\.Utils\.Result\`2')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
The validated \(and possibly normalised\) detail on success, or a
            [OidcError](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Common.OidcError 'Abblix\.Oidc\.Server\.Common\.OidcError') describing the rejection reason on
            failure\. RFC 9396 §5 makes the protocol\-level error code at the wire
            `invalid_authorization_details` regardless of the underlying reason\.
