コンテンツへ移動

sdk/windows

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

Markdown で表示

状態

パッケージステータス:実装済み・ローカル検証済み。dotnet test は 19 ケース(net8.0 クロスプラットフォームビルドと net10.0)をパスします。Windows 固有の API(WebView2、DPAPI、WinUI 3)は Windows ビルド環境での検証が必要です。実際の IdP ラウンドトリップは手動検証待ちです。このページは実装済みの動作を記録したものであり、本番対応の主張ではありません。

動作要件

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

インストール

アプリケーションプロジェクトファイルに PackageReference を追加します:

<ItemGroup>
  <PackageReference Include="Xid.Windows" Version="0.1.0" />
</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
});

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

// 3. Get a valid access token (auto-refresh)
string? token = await XidClient.Shared.GetAccessToken();

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

// 5. Sign out
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) 現在のセッションを返します。期限切れ間近の場合は自動更新します。
GetAccessToken(options?, ct) 有効なアクセストークン文字列を返します。必要な場合は更新をトリガーします。
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 キーで閉じる