状態
パッケージステータス:実装済み・ローカル検証済み。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 実装を使用してください。