---
title: C# SDK
description: 安装并使用官方 Sudomimus .NET 包。
editUrl: true
head: []
template: doc
sidebar:
  order: 4
  hidden: false
  attrs: {}
pagefind: true
draft: false
---

import { CardGrid, LinkCard } from "@astrojs/starlight/components";

C# SDK 为 Connect、Session、Native 和 Token surface 发布 .NET 包。Device authorization 当前没有 C# 包；这个流程请直接使用 [Device API 参考](/zh-cn/api/device/)。

## 包

| 包 | 用途 |
| --- | --- |
| `Sudomimus.Connect` | Connect inquiry 生命周期，以及通过应用元数据验 token。 |
| `Sudomimus.Session` | Refresh、introspection、logout、revoke-all，以及 token store 辅助。 |
| `Sudomimus.Native` | Steam ticket 与 AccessKey direct-issue。 |
| `Sudomimus.Token` | 独立的 token 解析与验证辅助。 |

安装当前集成需要的包：

```bash
dotnet add package Sudomimus.Connect
dotnet add package Sudomimus.Session
```

## Connect

```csharp
using Sudomimus.Connect;

var client = new ConnectClient(new ConnectClientOptions
{
    ClientAuth = new ConnectClientAuthWithKey
    {
        ApplicationAnchor = "your-app-anchor",
        PrivateKeyPem = File.ReadAllText("client-auth.pem"),
    },
});

var inquiry = await client.EstablishAsync(new EstablishRequest
{
    ApplicationAnchor = "your-app-anchor",
});
```

`/establish` 要求 audience 为 `sudomimus-connect` 的 client-auth JWT。配置 `ConnectClientOptions.ClientAuth` 后，SDK 会完成签名；也可以提供自己的 signer。

## Sessions

```csharp
using Sudomimus.Session;

var session = new RotatingSessionClient(
    new SessionClient(),
    new InMemoryTokenStore());

await session.SeedAsync(new TokenPair
{
    AccessToken = accessToken,
    RefreshToken = refreshToken,
});

var newAccessToken = await session.RefreshAsync();
await session.LogoutAsync();
```

`RevokeAllAsync` 是应用后端操作，需要 audience 为 `sudomimus-session` 的 client-auth 签名。

## Token 验证

令牌验证与 Connect 解耦。请从每应用 Session JWK Set `GET /applications/{applicationAnchor}/jwks.json` 解析 token 的 `kid`，按 `Cache-Control` 缓存，并使用 `Sudomimus.Token` 完成解析与签名验证。Connect `/info` 只返回本地化应用元数据。

验签后，把 payload `sub` 作为应用可见用户键，payload `sid` 作为逻辑会话 id，payload `jti` 作为 bearer 实例 id。Access token 不携带个人资料；refresh token 不携带用户标识，并额外包含 `rotationVersion`。当前资料从 Session `/userinfo` 获取。只做签名验证无法观察后续 logout，因此实时权威决策要使用 Session introspection。

## 源码

<CardGrid>
<LinkCard
    title=".NET packages"
    description="源码与包 README。"
    href="https://github.com/sudomimus/sudomimus/tree/master/sdks/csharp/src"
/>
<LinkCard
    title="选择 SDK"
    description="官方 SDK 与 Sudomimus API 的对应关系。"
    href="/zh-cn/sdk/overview/"
/>
</CardGrid>