次のような場合に使用: WPF デスクトップアプリケーションへのログイン、ログアウト、またはトークン(認証用の証拠となるデータ)管理機能を追加する場合。Auth0.OidcClient.WPF(Auth0 の認証ライブラリ)を統合します。ユーザーが「WPF アプリにログイン機能を追加したい」や「Windows デスクトップアプリに Auth0 を導入したい」と言った場合も対象です。
Use when adding Auth0 login, logout, or token management to a WPF desktop application. Integrates Auth0.OidcClient.WPF — use even if the user says "add login to my WPF app" or "add Auth0 to my Windows desktop app".
WPF(Windows Presentation Foundation)デスクトップアプリケーションにAuth0認証を追加します。
このスキルは Auth0.OidcClient.WPF NuGetパッケージを統合します。
このパッケージはWebView2を使用して、ポップアップウィンドウ内にAuth0ログインページを表示し、PKCEを用いたOIDCベースのセキュアなログイン・ログアウトフローを実現します。
SDKはWebAuth(PKCEを使用したOIDC認可コードフロー)を実行する際、WPF Windowにホストされたコントロール内でAuth0 Universal Loginページを表示します。 Info.plistやAndroidManifest.xmlへのURLスキーム登録が必要なネイティブモバイルSDKとは異なり、WPF SDKはコールバックをWebView2のナビゲーションイベント内で完結させます。カスタムURL Typeやプロトコルハンドラーは不要です。
Agentへの指示: SDKセットアップ手順を提示する前に、以下のコマンドを実行して最新リリースバージョンを取得してください:
gh api repos/auth0/auth0-oidc-client-net/releases --jq '[.[] | select(.tag_name | startswith("wpf-")) | .tag_name | ltrimstr("wpf-")] | .[0]'以下に記載されているハードコードされたバージョンの代わりに、取得したバージョンをすべての依存関係の記述に使用してください。
| ユースケース | 推奨スキル |
|---|---|
| .NET MAUIクロスプラットフォームアプリ | auth0-maui |
| Windows Formsデスクトップアプリ | auth0-winforms |
| ASP.NET Coreサーバーサイドウェブアプリ | auth0-aspnetcore-authentication |
| ASP.NET Core Web API(JWT検証) | auth0-aspnetcore-api |
| iOSのみのSwiftアプリ | auth0-swift |
| Androidのみのkotlinアプリ | auth0-android |
Agentへの指示: 開始前に、ユーザーのプロジェクトを以下の観点で確認してください:
.csprojファイルのTargetFrameworkから .NETバージョンを特定する- コードベースに既存の認証プロバイダーが存在するか確認する — 既存の
Auth0ClientまたはWebViewBrowserの使用箇所を検索し、見つかった場合は再利用する- プロジェクトの名前空間とディレクトリの規則を把握する
dotnet add package Auth0.OidcClient.WPFAuth0Client の初期化を追加し、XAMLのボタンクリックハンドラーにログイン・ログアウトを紐付けます。dotnet buildAgentへの指示:
Auth0Clientの設定を記述する際は以下に注意してください:
- このスキルのインテグレーションガイドに記載された正確なコードパターンを使用する。
- SDKはWebView2を使用してログインページをポップアップウィンドウ内に表示します — カスタムブラウザのセットアップは不要です。
- デフォルトのコールバックURLは
https://{yourDomain}/mobileです — Auth0ダッシュボードの「Allowed Callback URLs」および「Allowed Logout URLs」にこのURLを追加する必要があります。https://{domain}/ios/{bundleId}/callbackのようなプラットフォーム固有のパターンを使用するネイティブモバイルSDKとは異なり、WPFではシンプルなhttps://{domain}/mobileコールバック形式を使用します。設定とコードの記述後、ビルドが成功することを確認してください:
dotnet buildビルドが失敗した場合は問題の修正を試みてください。5〜6回試みても失敗する場合は、ユーザーに助けを求めてください。
WPF SDKのデフォルトコールバックURLは https://{yourDomain}/mobile です。
これはモバイルネイティブSDKとは異なります:
https://{domain}/ios/{bundleId}/callback や https://{domain}/android/{packageName}/callback のようなプラットフォーム固有のコールバックを使用しますhttps://{yourDomain}/mobile コールバックを使用しますコールバックはWebView2コントロールの NavigationStarting イベントによってインターセプトされるため、システムレベルのURLスキーム登録は不要です。
Info.plist、AndroidManifest.xml、またはWindowsプロトコルハンドラーの設定は一切必要ありません。
Auth0ダッシュボードで以下を設定してください:
https://{yourDomain}/mobilehttps://{yourDomain}/mobileAuth0.OidcClient.WPF パッケージがインストールされているAuth0Client にDomainとClientIdが設定されているhttps://{yourDomain}/mobile がAuth0ダッシュボードに登録されているAuth0ClientOptions の完全なリファレンス、クレーム、テストチェックリスト、トラブルシューティング| 間違い | 修正方法 |
|---|---|
| Auth0ダッシュボードでアプリタイプが Native に設定されていない | ダッシュボードの設定でアプリケーションタイプを「Native」に変更する |
| Auth0ダッシュボードにコールバックURLが登録されていない | 「Allowed Callback URLs」と「Allowed Logout URLs」の両方に https://{yourDomain}/mobile を追加する |
Domainの設定に https:// プレフィックスを使用している |
Domainはホスト名のみを指定する(例: tenant.auth0.com、https://tenant.auth0.com ではない) |
| WebView2 Runtimeがインストールされていない | Windows 10にMicrosoft Edge WebView2 Runtimeをインストールする(Windows 11には同梱済み) |
トークンリフレッシュ用の offline_access スコープを要求していない |
Auth0ClientOptions の Scope に offline_access を追加する |
| コード内にClientSecretを記述している | ネイティブアプリはClient Secretを使用しない — 削除すること |
| レジストリ・マニフェストへのURLスキーム登録を試みている | WPFはWebView2をプロセス内で使用するため、URLスキーム登録は不要(AppxManifestが必要なMAUIとは異なる) |
Agentへの指示: 実機でテストするようユーザーに案内してください。WebView2の一部の動作(ポップアップウィンドウ、証明書の処理など)は、リモートデスクトップや仮想マシン環境と物理的なWindowsマシンとで異なる場合があります。リリース前に、実際のハードウェア上でログイン → WebView2 → コールバック → トークン取得のフロー全体をテストしてください。
テストチェックリスト:
RefreshTokenAsync が動作するUserCancel を適切に処理するusing Auth0.OidcClient;
using System.Diagnostics;
// クライアントの初期化
var client = new Auth0Client(new Auth0ClientOptions
{
Domain = "{yourDomain}",
ClientId = "{yourClientId}",
Scope = "openid profile email offline_access"
});
// ログイン — WebView2ポップアップウィンドウを開く(PKCEを使用したWebAuthフロー)
var loginResult = await client.LoginAsync();
if (!loginResult.IsError)
{
var user = loginResult.User;
var name = user.FindFirst(c => c.Type == "name")?.Value;
var email = user.FindFirst(c => c.Type == "email")?.Value;
var picture = user.FindFirst(c => c.Type == "picture")?.Value;
Debug.WriteLine($"name: {name}");
Debug.WriteLine($"email: {email}");
foreach (var claim in loginResult.User.Claims)
{
Debug.WriteLine($"{claim.Type} = {claim.Value}");
}
}
// 後で使用するためにログイン時のリフレッシュトークンを保存する
var refreshToken = loginResult.RefreshToken;
// ログアウト
await client.LogoutAsync();
// トークンリフレッシュ(offline_accessスコープが必要)
var refreshResult = await client.RefreshTokenAsync(refreshToken);
if (refreshResult.IsError == false)
{
var newAccessToken = refreshResult.AccessToken;
}
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Auth0 WPF App" Height="450" Width="800">
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Button x:Name="LoginButton" Content="Login" Width="200" Height="40"
Margin="10" Click="LoginButton_Click" FontSize="16"/>
<Button x:Name="LogoutButton" Content="Logout" Width="200" Height="40"
Margin="10" Click="LogoutButton_Click" FontSize="16"/>
</StackPanel>
</Grid>
</Window>
using Auth0.OidcClient;
using System.Diagnostics;
namespace MyApp;
public partial class MainWindow : Window
{
private Auth0Client _client;
public MainWindow()
{
InitializeComponent();
_client = new Auth0Client(new Auth0ClientOptions
{
Domain = "{yourDomain}",
ClientId = "{yourClientId}",
Scope = "openid profile email offline_access"
});
}
private async void LoginButton_Click(object sender, RoutedEventArgs e)
{
var loginResult = await _client.LoginAsync();
if (loginResult.IsError)
{
Debug.WriteLine($"ログイン中にエラーが発生しました: {loginResult.Error}");
return;
}
var user = loginResult.User;
var name = user.FindFirst(c => c.Type == "name")?.
Add Auth0 authentication to WPF (Windows Presentation Foundation) desktop applications. This skill integrates the Auth0.OidcClient.WPF NuGet package which uses WebView2 to display the Auth0 login page in a popup window for secure OIDC-based login and logout flows with PKCE.
The SDK performs WebAuth (OIDC authorization code flow with PKCE) by opening the Auth0 Universal Login page inside a WebView2 control hosted in a WPF Window. Unlike native mobile SDKs that require URL scheme registration in Info.plist or AndroidManifest.xml, the WPF SDK handles the callback entirely within the WebView2 navigation events — no custom URL Types or protocol handlers are needed.
Agent instruction: Before providing SDK setup instructions, fetch the latest release version by running:
gh api repos/auth0/auth0-oidc-client-net/releases --jq '[.[] | select(.tag_name | startswith("wpf-")) | .tag_name | ltrimstr("wpf-")] | .[0]'Use the returned version in all dependency lines instead of any hardcoded version below.
| Use Case | Recommended Skill |
|---|---|
| .NET MAUI cross-platform app | auth0-maui |
| Windows Forms desktop app | auth0-winforms |
| ASP.NET Core server-side web app | auth0-aspnetcore-authentication |
| ASP.NET Core Web API (JWT validation) | auth0-aspnetcore-api |
| iOS-only Swift app | auth0-swift |
| Android-only Kotlin app | auth0-android |
Agent instruction: Before starting, examine the user's project:
- Identify the .NET version from the
.csprojfile (TargetFramework)- Check if there is already an existing authentication provider in the codebase — search for existing
Auth0ClientorWebViewBrowserusage and reuse if found- Note the project's namespace and directory conventions
dotnet add package Auth0.OidcClient.WPFAuth0Client initialization and wire login/logout to XAML button click handlers.dotnet buildAgent instruction: When writing the Auth0Client configuration:
- Use the exact code patterns from this skill's integration guide.
- The SDK uses WebView2 to show the login page in a popup window — no custom browser setup needed.
- The default callback URL is
https://{yourDomain}/mobile— this must be added to Auth0 Dashboard Allowed Callback URLs and Allowed Logout URLs.- Unlike native mobile SDKs that use
https://{domain}/ios/{bundleId}/callbackor similar platform-specific patterns, WPF uses the simplerhttps://{domain}/mobilecallback format.After writing configuration and code, verify the build succeeds:
dotnet buildIf the build fails, attempt to fix the issue. After 5-6 failed attempts, ask the user for help.
The WPF SDK uses https://{yourDomain}/mobile as its default callback URL. This differs from mobile native SDKs:
https://{domain}/ios/{bundleId}/callback or https://{domain}/android/{packageName}/callbackhttps://{yourDomain}/mobile callbackThe callback is intercepted by the WebView2 control's NavigationStarting event — no system-level URL scheme registration is required. You do NOT need to configure Info.plist, AndroidManifest.xml, or Windows protocol handlers.
Configure in the Auth0 Dashboard:
https://{yourDomain}/mobilehttps://{yourDomain}/mobileAuth0.OidcClient.WPF package installedAuth0Client configured with Domain and ClientIdhttps://{yourDomain}/mobile registered in Auth0 DashboardAuth0ClientOptions reference, claims, testing checklist, troubleshooting| Mistake | Fix |
|---|---|
| App type not set to Native in Auth0 Dashboard | Change application type to "Native" in Dashboard settings |
| Missing callback URL in Auth0 Dashboard | Add https://{yourDomain}/mobile to both Allowed Callback URLs AND Allowed Logout URLs |
Using https:// prefix in Domain config |
Domain should be hostname only (e.g., tenant.auth0.com, not https://tenant.auth0.com) |
| WebView2 Runtime not installed | Install Microsoft Edge WebView2 Runtime on Windows 10 (included with Windows 11) |
Not requesting offline_access scope for token refresh |
Add offline_access to Scope in Auth0ClientOptions |
| Storing ClientSecret in code | Native apps do NOT use a Client Secret — remove it |
| Trying to register URL scheme in registry/manifest | WPF uses WebView2 in-process — no URL scheme registration needed (unlike MAUI which needs AppxManifest) |
Agent instruction: Remind the user to test on a physical device. Some WebView2 behaviors (popup windows, certificate handling) may differ in remote desktop or virtual machine environments vs. physical Windows machines. Test the full login → WebView2 → callback → token flow on real hardware before shipping.
Testing Checklist:
RefreshTokenAsync with stored refresh token worksUserCancel gracefullyusing Auth0.OidcClient;
using System.Diagnostics;
// Initialize client
var client = new Auth0Client(new Auth0ClientOptions
{
Domain = "{yourDomain}",
ClientId = "{yourClientId}",
Scope = "openid profile email offline_access"
});
// Login — opens WebView2 popup window (WebAuth flow with PKCE)
var loginResult = await client.LoginAsync();
if (!loginResult.IsError)
{
var user = loginResult.User;
var name = user.FindFirst(c => c.Type == "name")?.Value;
var email = user.FindFirst(c => c.Type == "email")?.Value;
var picture = user.FindFirst(c => c.Type == "picture")?.Value;
Debug.WriteLine($"name: {name}");
Debug.WriteLine($"email: {email}");
foreach (var claim in loginResult.User.Claims)
{
Debug.WriteLine($"{claim.Type} = {claim.Value}");
}
}
// Store the refresh token from login for later use
var refreshToken = loginResult.RefreshToken;
// Logout
await client.LogoutAsync();
// Refresh token (requires offline_access scope)
var refreshResult = await client.RefreshTokenAsync(refreshToken);
if (refreshResult.IsError == false)
{
var newAccessToken = refreshResult.AccessToken;
}
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Auth0 WPF App" Height="450" Width="800">
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Button x:Name="LoginButton" Content="Login" Width="200" Height="40"
Margin="10" Click="LoginButton_Click" FontSize="16"/>
<Button x:Name="LogoutButton" Content="Logout" Width="200" Height="40"
Margin="10" Click="LogoutButton_Click" FontSize="16"/>
</StackPanel>
</Grid>
</Window>
using Auth0.OidcClient;
using System.Diagnostics;
namespace MyApp;
public partial class MainWindow : Window
{
private Auth0Client _client;
public MainWindow()
{
InitializeComponent();
_client = new Auth0Client(new Auth0ClientOptions
{
Domain = "{yourDomain}",
ClientId = "{yourClientId}",
Scope = "openid profile email offline_access"
});
}
private async void LoginButton_Click(object sender, RoutedEventArgs e)
{
var loginResult = await _client.LoginAsync();
if (loginResult.IsError)
{
Debug.WriteLine($"An error occurred during login: {loginResult.Error}");
return;
}
var user = loginResult.User;
var name = user.FindFirst(c => c.Type == "name")?.Value;
var email = user.FindFirst(c => c.Type == "email")?.Value;
var picture = user.FindFirst(c => c.Type == "picture")?.Value;
Debug.WriteLine($"name: {name}");
Debug.WriteLine($"email: {email}");
foreach (var claim in loginResult.User.Claims)
{
Debug.WriteLine($"{claim.Type} = {claim.Value}");
}
}
private async void LogoutButton_Click(object sender, RoutedEventArgs e)
{
await _client.LogoutAsync();
}
}
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。