メインコンテンツへスキップ

AI を使って Auth0 を統合する

Claude Code、Cursor、GitHub Copilot などの AI コーディング アシスタントを使用すると、agent skills を使って数分で Auth0 認証を自動追加できます。インストール:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-wpf --skill auth0-winforms
次に、AI アシスタントに次のように依頼します。
Add Auth0 authentication to my WPF or WinForms app
AI アシスタントは、Auth0 アプリケーションの作成、認証情報の取得、Auth0 OidcClient SDK のインストール、コールバック URL の設定、ログイン/ログアウト フローの実装を自動的に行います。agent skills の完全なドキュメント →
前提条件: 開始する前に、次のものを用意してください。.NET バージョンの互換性: このクイックスタートは .NET 8.0.NET 9.0、および .NET Framework 4.6.2 で利用できます。

はじめに

このクイックスタートでは、WPF または WinForms のデスクトップアプリケーションに Auth0 認証を追加する方法を説明します。Auth0 を設定し、SDK をインストールしたうえで、WPF および WinForms 向けの Auth0 OIDC Client を使用して、ログイン、ログアウト、ユーザープロファイルの表示を実装します。
1

アプリケーションを作成する

すでに WPF または WinForms のプロジェクトがある場合は、この手順を飛ばして次に進んでください。
新しいプロジェクトを作成し、そのディレクトリを開きます。
dotnet new wpf -n MyApp
cd MyApp
2

Auth0 を設定する

Auth0 サービスを利用するには、Auth0 Dashboard でアプリケーションを設定しておく必要があります。Auth0 のアプリケーションでは、プロジェクトでの認証の動作を設定します。

アプリケーションを設定する

Auth0 DashboardApplicationsApplications に移動し、新しいアプリケーションを作成します。
  1. Create Application をクリックします
  2. アプリケーションの名前を入力します
  3. アプリケーションタイプとして Native を選択します
  4. Create をクリックします
Settings タブで、ドメインクライアントID を控えておきます。SDK の初期化時に必要になります。

コールバックURLを設定する

コールバックURLは、ユーザーの認証後に Auth0 がリダイレクトするアプリケーション内の URL です。これが設定されていないと、ユーザーはログイン後にアプリケーションへ戻れません。Application Settings で、次の値を Allowed Callback URLs に追加します。
https://{yourDomain}/mobile

ログアウト URL を設定する

ログアウト URL とは、ユーザーのログアウト後に Auth0 がリダイレクトするアプリケーション内の URL です。これが設定されていない場合、ユーザーはアプリケーションからログアウトできず、エラーが表示されます。Application Settings の Allowed Logout URLs に、次を追加します。
https://{yourDomain}/mobile
3

Auth0 SDK をインストールする

Auth0 では、WPF 用と WinForms 用に別々の NuGet パッケージを提供しています。プロジェクトの種類に応じたものをインストールしてください。
Package Manager Console ([ツール] → [NuGet パッケージ マネージャー] → [Package Manager Console]) を開き、次を実行します。
# WPF
Install-Package Auth0.OidcClient.WPF

# WinForms
Install-Package Auth0.OidcClient.WinForms
4

Auth0Clientをインスタンス化する

アプリケーションに Auth0 を統合するには、Auth0 の ドメインクライアントID を指定して Auth0Client をインスタンス化します。プライベート フィールドを追加し、メイン ウィンドウまたはフォームの既存のコンストラクター内で初期化してください。
MainWindow.xaml.cs を開き、次のように更新します。
MainWindow.xaml.cs
using Auth0.OidcClient;

// アプリケーションに別の名前を付けた場合は、
// それに合わせて名前空間も更新してください。
namespace MyApp; 

public partial class MainWindow : Window
{
    private Auth0Client _client;

    public MainWindow()
    {
        InitializeComponent();

        _client = new Auth0Client(new Auth0ClientOptions
        {
            Domain = "{yourDomain}",
            ClientId = "{yourClientId}"
        });
    }
}
5

アプリケーションにログインを追加する

ユーザーをログインさせるには、SDK の LoginAsync() メソッドを使用します。このメソッドを呼び出すと、Auth0 Universal Login ページを表示するポップアップウィンドウが開きます。認証が成功すると、Auth0 はコールバック URL にリダイレクトし、SDK は LoginResult を返します。まず、UI にログインボタンを追加します。
MainWindow.xaml を開き、<Grid> 内に Button を追加します。
MainWindow.xaml
<Grid>
    <Button x:Name="LoginButton"
            Content="Log In"
            Width="120" Height="40"
            HorizontalAlignment="Center" VerticalAlignment="Center"
            Click="LoginButton_Click" />
</Grid>
次に、MainWindow.xaml.cs にクリック ハンドラーを追加します。
MainWindow.xaml.cs
private async void LoginButton_Click(object sender, RoutedEventArgs e)
{
    var loginResult = await _client.LoginAsync();

    if (loginResult.IsError == false)
    {
        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;
    }
}
エラーがなければ、結果の LoginResult.UserLoginResult.IdentityTokenLoginResult.AccessTokenLoginResult.RefreshToken にアクセスできます。
6

アプリケーションにログアウト機能を追加する

ユーザーをログアウトするには、SDK の LogoutAsync() メソッドを使用します。これによりポップアップ ウィンドウが開き、セッションをクリアするために Auth0 のログアウト エンドポイントへリダイレクトされた後、設定したログアウト URL にリダイレクトされます。まず、UI にログアウト ボタンを追加します。
MainWindow.xaml を開き、ログイン ボタンの横にログアウト Button を追加します。
MainWindow.xaml
    <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>
次に、MainWindow.xaml.cs にクリック ハンドラーを追加します。
MainWindow.xaml.cs
private async void LogoutButton_Click(object sender, RoutedEventArgs e)
{
    await _client.LogoutAsync();
}
7

ユーザーのプロフィール情報を表示する

LoginResult.User プロパティは、認証されたユーザーのプロフィールを含む ClaimsPrincipal です。アプリケーションにユーザー情報を表示するには、クレームを参照してください。
if (loginResult.IsError == false)
{
    Debug.WriteLine($"name: {loginResult.User.FindFirst(c => c.Type == "name")?.Value}");
    Debug.WriteLine($"email: {loginResult.User.FindFirst(c => c.Type == "email")?.Value}");
}
IDトークンで返されるすべてのクレームを確認するには、次のようにします。
if (loginResult.IsError == false)
{
    foreach (var claim in loginResult.User.Claims)
    {
        Debug.WriteLine($"{claim.Type} = {claim.Value}");
    }
}
チェックポイントこれで、Auth0 と連携した WPF または WinForms アプリケーションが動作する状態になっているはずです。アプリケーションを実行し、次の点を確認してください。
  • ログインボタンをクリックすると、ポップアップウィンドウで Auth0 Universal Login ページが開く。
  • ログインまたはサインアップができる。
  • 認証後、LoginResult.User からユーザー情報にアクセスできる。
  • ログアウトボタンをクリックすると、セッションがクリアされ、ログアウト URL にリダイレクトされる。

高度な使い方

トークンやユーザーのプロパティにアクセスする前に、LoginResult.IsError を確認してください。認証に失敗した場合は、Error プロパティと ErrorDescription プロパティに詳細が格納されます。
var loginResult = await _client.LoginAsync();

if (loginResult.IsError)
{
    Debug.WriteLine($"An error occurred during login: {loginResult.Error}");
    // loginResult.ErrorDescription には完全なエラーメッセージが含まれます
    return;
}

// ここではトークンとユーザーに安全にアクセスできます
Debug.WriteLine($"id_token: {loginResult.IdentityToken}");
Debug.WriteLine($"access_token: {loginResult.AccessToken}");
ユーザーが認証せずにログイン用のポップアップを閉じた場合、LoginAsync()BrowserResultType.UserCancel を持つ結果を返します。これは想定された動作であり、エラーとして扱わないでください。
ユーザーに再度ログインさせることなく新しいアクセストークンを取得するには、最初の LoginResult で取得したリフレッシュトークンを使って RefreshTokenAsync() を呼び出します。
// リフレッシュトークンを受け取るには offline_access スコープを要求します
_client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Scope = "openid profile email offline_access"
});

// 初回ログインで取得したリフレッシュトークンを保存します
var refreshToken = loginResult.RefreshToken;

// 後で新しいトークンと交換します
var refreshResult = await _client.RefreshTokenAsync(refreshToken);

if (refreshResult.IsError == false)
{
    var newAccessToken = refreshResult.AccessToken;
}
リフレッシュトークンを使用するには offline_access スコープが必要です。また、Auth0 の Application Settings の Refresh Token Rotation で有効にしておく必要があります。

追加リソース

SDK リポジトリ

Auth0 OIDC Client for .NET のソースコード、リリースノート、Issue トラッカー

ユーザープロファイル

ユーザープロファイルのクレームと /userinfo エンドポイントについて詳しく確認する

コミュニティフォーラム

Auth0 コミュニティからサポートを受ける

よくある問題

問題: WebView2 のポップアップウィンドウが開いてログインページは表示されますが、認証情報を入力しても何も起こりません。解決策: Microsoft Edge WebView2 Runtime がマシンにインストールされていません。Microsoft WebView2 のダウンロードページ からインストールしてください。WebView2 は Windows 11 と最近の Windows 10 ビルドには含まれていますが、古いシステムでは別途インストールする必要があります。
問題: ログイン後、Auth0 から callback URL mismatch エラーが返されます。解決策: SDK が使用するリダイレクト URI が、Auth0 Dashboard の Allowed Callback URLs に設定されているいずれの値とも一致していません。Application Settings の Allowed Callback URLs に https://{yourDomain}/mobile を追加してください。SDK はデフォルトでこの URL を使用します。
問題: ログアウト後、未登録のログアウト URL に関するエラーが Auth0 から返されます。解決策: Application Settings の Allowed Logout URLshttps://{yourDomain}/mobile を追加してください。
問題: LoginResult.IsErrortrue ですが、原因を示す明確な情報がありません。解決策: 詳細は LoginResult.ErrorLoginResult.ErrorDescription を確認してください。
if (loginResult.IsError)
{
    Debug.WriteLine($"Error: {loginResult.Error}");
    Debug.WriteLine($"Description: {loginResult.ErrorDescription}");
}
よくある原因:
  • Auth0 Dashboard のアプリケーションタイプが Native に設定されていない
  • Advanced Settings → OAuth で OIDC Conformant が有効になっていない
  • JSON Web Token Signature AlgorithmRS256 に設定されていない
問題: LoginResult.RefreshTokennull です。解決策: リフレッシュトークンを受け取るには offline_access スコープが必要です。これを Scope オプションに追加してください。
_client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Scope = "openid profile email offline_access"
});
また、Auth0 Dashboard の Application Settings で Refresh Token Rotation が有効になっていることも確認してください。