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

## ProofError Class

Describes why a DPoP proof was rejected\. [Reason](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Reason 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Reason') is a stable token suitable for log
filters and metric labels; [Detail](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Detail 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Detail') is a human\-readable hint\.

```csharp
public sealed record ProofError : System.IEquatable<Abblix.Oidc.Server.Features.DPoP.ProofError>
```

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

Implements [System\.IEquatable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1 'System\.IEquatable\`1')[ProofError](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1 'System\.IEquatable\`1')

### Remarks
[Detail](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Detail 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Detail') CAN carry what the client put in the token: the JWT core writes several of its
            descriptions by quoting the value it refused \- an unhandled `crit` name, an unregistered
            algorithm \- and this type passes those through unchanged\. An earlier version of this summary said
            the value must not contain such input, which made it read as safe to surface; it was already
            carrying it\.
            

So the library puts it nowhere: no response, no log, no metric label. What a host reads off the
[ProofError](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError') its own call returned is its own to sanitise, and a host that copies it
into a response is echoing the client's bytes.
### Constructors

## ProofError\(string, string\) Constructor {#Abblix.Oidc.Server.Features.DPoP.ProofError.ProofError(string,string)}

Describes why a DPoP proof was rejected\. [Reason](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Reason 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Reason') is a stable token suitable for log
filters and metric labels; [Detail](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Detail 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Detail') is a human\-readable hint\.

```csharp
public ProofError(string Reason, string? Detail=null);
```
#### Parameters

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

A stable, machine\-friendly token \(e\.g\. `invalid_typ`,
            `signature_invalid`, `htm_mismatch`\)\.

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

Optional human\-readable diagnostic\.

### Remarks
[Detail](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError#Abblix.Oidc.Server.Features.DPoP.ProofError.Detail 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError\.Detail') CAN carry what the client put in the token: the JWT core writes several of its
            descriptions by quoting the value it refused \- an unhandled `crit` name, an unregistered
            algorithm \- and this type passes those through unchanged\. An earlier version of this summary said
            the value must not contain such input, which made it read as safe to surface; it was already
            carrying it\.
            

So the library puts it nowhere: no response, no log, no metric label. What a host reads off the
[ProofError](https://www.abblix.com/docs/api/abblix-oidc-server/Abblix.Oidc.Server.Features.DPoP.ProofError 'Abblix\.Oidc\.Server\.Features\.DPoP\.ProofError') its own call returned is its own to sanitise, and a host that copies it
into a response is echoing the client's bytes.
### Properties

## ProofError\.Detail Property {#Abblix.Oidc.Server.Features.DPoP.ProofError.Detail}

Optional human\-readable diagnostic\.

```csharp
public string? Detail { get; init; }
```

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

## ProofError\.Reason Property {#Abblix.Oidc.Server.Features.DPoP.ProofError.Reason}

A stable, machine\-friendly token \(e\.g\. `invalid_typ`,
            `signature_invalid`, `htm_mismatch`\)\.

```csharp
public string Reason { get; init; }
```

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