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

## AuthorizationValueReuseDetector Class

Default [IAuthorizationValueReuseDetector](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector 'Abblix\.Oidc\.Server\.Features\.ReusePrevention\.IAuthorizationValueReuseDetector') implementation backed by [IEntityStorage](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.Storages.IEntityStorage 'Abblix\.Oidc\.Server\.Features\.Storages\.IEntityStorage')\.
It records a SHA\-256 hash of each value under a per\-client, per\-kind key with a time\-to\-live equal to the
configured detection window, so a raw code\_challenge or nonce never lands in the cache and entries expire
on their own\.

```csharp
public class AuthorizationValueReuseDetector : Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector
```

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

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

## AuthorizationValueReuseDetector\(IEntityStorage, IEntityStorageKeyFactory, IOptions\<OidcOptions\>\) Constructor {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.AuthorizationValueReuseDetector(Abblix.Oidc.Server.Features.Storages.IEntityStorage,Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory,Microsoft.Extensions.Options.IOptions_Abblix.Oidc.Server.Common.Configuration.OidcOptions_)}

Default [IAuthorizationValueReuseDetector](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector 'Abblix\.Oidc\.Server\.Features\.ReusePrevention\.IAuthorizationValueReuseDetector') implementation backed by [IEntityStorage](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.Storages.IEntityStorage 'Abblix\.Oidc\.Server\.Features\.Storages\.IEntityStorage')\.
It records a SHA\-256 hash of each value under a per\-client, per\-kind key with a time\-to\-live equal to the
configured detection window, so a raw code\_challenge or nonce never lands in the cache and entries expire
on their own\.

```csharp
public AuthorizationValueReuseDetector(Abblix.Oidc.Server.Features.Storages.IEntityStorage storage, Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory keyFactory, Microsoft.Extensions.Options.IOptions<Abblix.Oidc.Server.Common.Configuration.OidcOptions> options);
```
#### Parameters

###### `storage` [IEntityStorage](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.Storages.IEntityStorage 'Abblix\.Oidc\.Server\.Features\.Storages\.IEntityStorage') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.AuthorizationValueReuseDetector(Abblix.Oidc.Server.Features.Storages.IEntityStorage,Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory,Microsoft.Extensions.Options.IOptions_Abblix.Oidc.Server.Common.Configuration.OidcOptions_).storage}

###### `keyFactory` [IEntityStorageKeyFactory](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory 'Abblix\.Oidc\.Server\.Features\.Storages\.IEntityStorageKeyFactory') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.AuthorizationValueReuseDetector(Abblix.Oidc.Server.Features.Storages.IEntityStorage,Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory,Microsoft.Extensions.Options.IOptions_Abblix.Oidc.Server.Common.Configuration.OidcOptions_).keyFactory}

###### `options` [Microsoft\.Extensions\.Options\.IOptions&lt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.options.ioptions-1 'Microsoft\.Extensions\.Options\.IOptions\`1')[OidcOptions](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Common.Configuration.OidcOptions 'Abblix\.Oidc\.Server\.Common\.Configuration\.OidcOptions')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.options.ioptions-1 'Microsoft\.Extensions\.Options\.IOptions\`1') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.AuthorizationValueReuseDetector(Abblix.Oidc.Server.Features.Storages.IEntityStorage,Abblix.Oidc.Server.Features.Storages.IEntityStorageKeyFactory,Microsoft.Extensions.Options.IOptions_Abblix.Oidc.Server.Common.Configuration.OidcOptions_).options}
### Methods

## AuthorizationValueReuseDetector\.IsReusedAsync\(string, string, string\) Method {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.IsReusedAsync(string,string,string)}

Reports whether a value of the given kind has already been recorded for this client within the
detection window — that is, whether the client is repeating a value that must be unique per request\.

```csharp
public System.Threading.Tasks.Task<bool> IsReusedAsync(string clientId, string valueKind, string value);
```
#### Parameters

###### `clientId` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.IsReusedAsync(string,string,string).clientId}

The client presenting the value\.

###### `valueKind` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.IsReusedAsync(string,string,string).valueKind}

A discriminator for the value's role \(for example the parameter name\), so
            a `code_challenge` and a `nonce` that happen to coincide are tracked separately\.

###### `value` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.IsReusedAsync(string,string,string).value}

The raw value; only a hash of it is ever stored\.

Implements [IsReusedAsync\(string, string, string\)](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector#Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector.IsReusedAsync(string,string,string) 'Abblix\.Oidc\.Server\.Features\.ReusePrevention\.IAuthorizationValueReuseDetector\.IsReusedAsync\(string, string, string\)')

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[System\.Boolean](https://learn.microsoft.com/en-us/dotnet/api/system.boolean 'System\.Boolean')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
`true` when the value was seen before within the window; otherwise `false`\.
            Always `false` when detection is disabled\.

## AuthorizationValueReuseDetector\.RecordAsync\(string, string, string\) Method {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.RecordAsync(string,string,string)}

Records a value as used by this client so a later reuse within the detection window is caught\.
A no\-op when detection is disabled\. Called once per issued authorization code, not on every
authorization request, so re\-processing one request across a login or consent redirect is not flagged\.

```csharp
public System.Threading.Tasks.Task RecordAsync(string clientId, string valueKind, string value);
```
#### Parameters

###### `clientId` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.RecordAsync(string,string,string).clientId}

###### `valueKind` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.RecordAsync(string,string,string).valueKind}

###### `value` [System\.String](https://learn.microsoft.com/en-us/dotnet/api/system.string 'System\.String') {#Abblix.Oidc.Server.Features.ReusePrevention.AuthorizationValueReuseDetector.RecordAsync(string,string,string).value}

Implements [RecordAsync\(string, string, string\)](https://www.abblix.com/en/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector#Abblix.Oidc.Server.Features.ReusePrevention.IAuthorizationValueReuseDetector.RecordAsync(string,string,string) 'Abblix\.Oidc\.Server\.Features\.ReusePrevention\.IAuthorizationValueReuseDetector\.RecordAsync\(string, string, string\)')

#### Returns
[System\.Threading\.Tasks\.Task](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task 'System\.Threading\.Tasks\.Task')
