---
title: "sdk/dotnet"
description: "SDK serveur .NET 8 pour la vérification JWT sans réseau,l'authentification des requêtes ASP.NET Core et la validation dessignatures webhook."
locale: "fr"
---

> Documentation Index
> Fetch the locale documentation index at: https://xid.dev/fr/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/dotnet

## Statut

Implémenté et vérifié localement. La vérification aller-retour avec unvrai IdP (récupération JWKS, signature/vérification de jeton contre uneinstance XID active) n'a pas encore été effectuée et doit être complétéeavant toute utilisation en production.

## Installer

.NET 8 requis comme cible.

```xml
<PackageReference Include="Xid" Version="0.1.0" />
```

## Configuration ASP.NET Core (recommandée)

```csharp
// Program.cs
using Xid;

builder.Services.AddXid(options =>
{
options.Issuer   = "https://xid.dev";
options.Audience = "your-client-id"; // optional
});
```

## Authentifier une requête

```csharp
// Controller / Minimal API
public class MyController(XidClient xid) : ControllerBase
{
[HttpGet("/me")]
public async Task<IActionResult> GetMe()
{
    var auth = await xid.AuthenticateRequestAsync(
        authorizationHeader: Request.Headers.Authorization,
        cookies: Request.Cookies.ToDictionary(c => c.Key, c => c.Value));

    if (!auth.Authenticated)
        return Unauthorized(auth.Reason);

    return Ok(new { sub = auth.Claims!.Sub, email = auth.Claims.Email });
}
}
```

## Vérifier le jeton directement

```csharp
using Xid;

var client = new XidClient(new XidOptions { Issuer = "https://xid.dev" });

try
{
var claims = await client.VerifyTokenAsync("eyJ...");
Console.WriteLine($"sub={claims.Sub} email={claims.Email}");
}
catch (TokenVerificationException ex)
{
Console.WriteLine($"Invalid token: {ex.Message}");
}
```

## Vérifier le webhook

```csharp
app.MapPost("/webhooks/xid", async (HttpRequest req, XidClient xid) =>
{
using var ms = new MemoryStream();
await req.Body.CopyToAsync(ms);
var body = ms.ToArray();

var headers = new Dictionary<string, string>
{
    ["svix-id"]        = req.Headers["svix-id"].ToString(),
    ["svix-timestamp"] = req.Headers["svix-timestamp"].ToString(),
    ["svix-signature"] = req.Headers["svix-signature"].ToString(),
};

var webhookSecret = Environment.GetEnvironmentVariable("XID_WEBHOOK_SECRET")
    ?? throw new InvalidOperationException("XID_WEBHOOK_SECRET is required");

try
{
    var webhook = xid.VerifyWebhook(body, headers, secret: webhookSecret);
    return Results.Ok();
}
catch (WebhookVerificationException ex)
{
    return Results.BadRequest(ex.Message);
}
});
```

## XidOptions

| Propriété | Défaut | Description |
| --- | --- | --- |
| `Issuer` | requis | URL d'émetteur XID |
| `Audience` | `null` | Revendication aud attendue ; null ignore la validation |
| `JwksTtl` | 1 heure | TTL du cache JWKS en mémoire |
| `SessionCookieName` | `__session` | Nom de cookie de repli pour l'extraction du jeton |
| `ClockSkew` | 5 minutes | Tolérance au décalage d'horloge JWT pour exp/nbf |
| `WebhookToleranceWindow` | 5 minutes | Fenêtre de prévention des relectures de webhook |

## API XidClient

| Méthode | Description |
| --- | --- |
| `VerifyTokenAsync(token, ct)` | Vérifier la chaîne JWT ; lève `TokenVerificationException` en casd'échec. |
| `AuthenticateRequestAsync(authHeader, cookies, ct)` | Extraire et vérifier le jeton ; retourne `AuthStatus` ; ne lève pasd'exception. |
| `VerifyWebhook(payload, headers, secret)` | Valider la signature webhook ; lève `WebhookVerificationException` encas d'échec. Synchrone. |

## Notes de plateforme

- Utilise `Microsoft.IdentityModel.Tokens` et`System.IdentityModel.Tokens.Jwt` 8.x. ES256 est principal ; RS256 etPS256 sont pris en charge.
- `AddXid()` enregistre `XidClient` en tant que singleton et câble`IHttpClientFactory` pour la récupération JWKS.
- Hiérarchie d'exceptions : `XidException` -&gt; `JwksException`,`TokenVerificationException`, `WebhookVerificationException`.

Source: https://xid.dev/fr/sdks/dotnet/index.mdx
