コンテンツへ移動

sdk/windows

認可に WebView2、PKCE S256、トークン永続化に DPAPI 保護の IsolatedStorage を使用した WinUI 3 アプリケーション向け C# / .NET SDK。

Markdown で表示

状態

パッケージのステータスは 実装済み・ローカル検証済み です。クロスプラットフォームの .NET 単体テストスイートは成功しています。WebView2、DPAPI、WinUI 3、および実際の IdP ラウンドトリップの検証には、引き続き Windows 統合環境が必要です。このページは実装済みの動作を説明するものであり、本番対応済みであるとの主張ではありません。

Registry 状態: UNPUBLISHED。この SDK はリポジトリのソース checkout からのみインストールし、外部 package registry は使用しないでください。

動作要件

  • .NET 8 および Windows App SDK 1.6+
  • WebView2 Runtime(Evergreen — Microsoft Edge と共にプリインストール)
  • アプリケーションはプロジェクトファイルで <UseWinUI>true</UseWinUI> を設定する必要があります

インストール

アプリケーションのプロジェクトファイルに、ソース checkout への ProjectReference を追加します:

<ItemGroup>
  <ProjectReference Include="../xid/sdk/windows/Xid.Windows.csproj" />
</ItemGroup>

クイックスタート

using Xid.Windows;

// 1. Configure in App.xaml.cs OnLaunched.
XidClient.Shared.Configure(new XidConfiguration
{
    Issuer      = new Uri("https://xid.dev"),
    ClientId    = "your_client_id",
    RedirectUri = "com.example.myapp://auth/callback",
    // Scopes default: openid profile email. offline_access is rejected until DPoP is implemented.
});

// 2. Sign in (opens embedded WebView2 window)
XidSession session = await XidClient.Shared.SignInAsync();
Console.WriteLine($"Signed in: {session.User.Email}");

// 3. Get the current unexpired access token. Expiry requires reauthorization.
string? token = await XidClient.Shared.GetAccessToken();

// 4. Get the current unexpired session.
XidSession? current = await XidClient.Shared.GetSession();

// 5. Clear local state.
await XidClient.Shared.SignOut();

カスタム URI スキームコールバック(オプション)

WebView2 埋め込みウィンドウではなくカスタム URI スキームリダイレクトを使用する場合は、プロトコルアクティベーション URI を HandleRedirectAsync に転送します:

// App.xaml.cs
protected override void OnActivated(IActivatedEventArgs args)
{
    if (args.Kind == ActivationKind.Protocol)
    {
        var protocolArgs = (ProtocolActivatedEventArgs)args;
        await XidClient.Shared.HandleRedirectAsync(protocolArgs.Uri);
    }
}

コア API

方式 説明
Configure(XidConfiguration) SDK を初期化します。アプリケーション起動時に一度呼び出します。
SignInAsync(options?, ct) PKCE S256 で埋め込み WebView2 認可ウィンドウを開きます。完了時に XidSession を返します。
HandleRedirectAsync(Uri, ct) カスタム URI スキームコールバックを処理し、認可コードを交換します。
GetSession(ct) 現在の有効期限内のセッションを返します。ローカル state の有効期限が切れている場合は消去し、null を返します。
GetAccessToken(options?, ct) 現在の有効期限内の access token を返します。ForceRefresh はセッションを消去し、再認可を要求します。
SignOut(ct) DPAPI 保護の IsolatedStorage からローカルセッショントークンをクリアします。
SetTokenStorage(ITokenStorage) デフォルト DpapiTokenStorage をカスタム ITokenStorage 実装で置き換えます。

ストレージアダプター

デフォルトストレージは DPAPI(CurrentUser スコープ)でトークンを暗号化し、IsolatedStorage に永続化します。Windows Hello や Credential Manager を使用するには ITokenStorage を実装してください:

public sealed class MyCustomStorage : ITokenStorage
{
    public Task SaveAsync(StoredTokenSet tokens, CancellationToken ct = default) { ... }
    public Task<StoredTokenSet?> LoadAsync(CancellationToken ct = default) { ... }
    public Task ClearAsync(CancellationToken ct = default) { ... }
}
XidClient.Shared.SetTokenStorage(new MyCustomStorage());

依存関係

パッケージ バージョン 目的
Microsoft.WindowsAppSDK 1.6.250228002 WinUI 3 ホストと WebView2 埋め込み
Microsoft.Web.WebView2 1.0.3065.39 Chromium ベースの埋め込み認可ウィンドウ
System.Security.Cryptography.ProtectedData 8.0.0 保存時の DPAPI トークン暗号化

セキュリティ

  • パブリッククライアント — クライアントシークレットは保存・送信されません。
  • PKCE S256 のみ。サーバーは plain チャレンジメソッドを拒否します。
  • DPAPI(CurrentUser スコープ)で暗号化され、IsolatedStorage に保存されます。他の Windows ユーザーアカウントからはアクセスできません。
  • リクエストごとに生成される OAuth state。CSRF を防ぐためリダイレクト時に検証されます。

既知の制限事項

  • WebView2 Runtime が必要です。フォールバックとしての WebAuthenticationBroker のサポートは計画中ですが、まだ実装されていません。
  • JWKS による ID token 検証と end_session sign-out は実装済みでローカルテスト済みです。L4 には Windows WebView2、DPAPI、IdP の検証が必要です。
  • DpapiTokenStorage は Windows 以外のプラットフォームでは動作しません。クロスコンパイル時は別の ITokenStorage 実装を使用してください。
ナビゲーション

入力して検索...

矢印キーで移動Enter キーで選択Escape キーで閉じる