0Pricing
C# Academy · レッスン

トークンの発行

ログイン時に署名済みトークンを生成します。

「トークンの発行」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

発行と検証

ここまではトークンを検証しました。次はトークンを発行します。ユーザーのログインが成功したら、API が署名付き JWT を生成して返します。

この処理の中心となる型は、System.IdentityModel.Tokens.Jwt の JwtSecurityTokenHandler です。

dotnet add package System.IdentityModel.Tokens.Jwt

署名キー

トークンに署名するにはキーが必要です。HS256 では、検証側が使うのと同じ対称シークレットを再利用します。

このシークレットはソース管理に含めず、構成またはシークレットストアから読み込んでください。

var key = new SymmetricSecurityKey(
    Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!));

SigningCredentials

SigningCredentials はキーとアルゴリズムを組み合わせます。対称キーには SecurityAlgorithms.HmacSha256 を使用します。

var creds = new SigningCredentials(
    key,
    SecurityAlgorithms.HmacSha256);

クレームの構築

トークンに含める情報を決めます。必ずサブジェクト(ユーザー ID)と、API が必要とするロールやデータを含めてください。

各トークンを識別できるよう、一意の jti を追加します。

var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(ClaimTypes.Name, user.UserName),
    new Claim(ClaimTypes.Role, user.Role)
};

JwtSecurityToken の作成

JwtSecurityToken は、発行者、オーディエンス、クレーム、有効期限、署名資格情報を1つのトークンオブジェクトにまとめます。

var token = new JwtSecurityToken(
    issuer: configuration["Jwt:Issuer"],
    audience: configuration["Jwt:Audience"],
    claims: claims,
    notBefore: DateTime.UtcNow,
    expires: DateTime.UtcNow.AddMinutes(15),
    signingCredentials: creds);

文字列へのシリアライズ

クライアントに送信する前に、トークンオブジェクトをコンパクトな header.payload.signature 形式の文字列に書き出す必要があります。

var handler = new JwtSecurityTokenHandler();
string jwt = handler.WriteToken(token);
// jwt now looks like eyJhbGciOiJI...

再利用可能なトークンサービス

ロジックをサービスにまとめることで、コントローラーをシンプルに保ち、構成を1か所に集約できます。

public class TokenService(IConfiguration config)
{
    public string CreateAccessToken(AppUser user)
    {
        var key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(config["Jwt:Key"]!));
        var creds = new SigningCredentials(
            key, SecurityAlgorithms.HmacSha256);
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
            new Claim(ClaimTypes.Role, user.Role)
        };
        var token = new JwtSecurityToken(
            config["Jwt:Issuer"], config["Jwt:Audience"],
            claims, expires: DateTime.UtcNow.AddMinutes(15),
            signingCredentials: creds);
        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

ログインエンドポイントの組み込み

ログインエンドポイントで認証情報を検証し、その後サービスを呼び出してトークンをクライアントに返します。

app.MapPost("/login", (LoginDto dto, TokenService tokens) =>
{
    var user = Authenticate(dto.Username, dto.Password);
    if (user is null) return Results.Unauthorized();
    return Results.Ok(new { accessToken = tokens.CreateAccessToken(user) });
});

対称方式と非対称方式

HS256 では、署名と検証の両方に1つの共有シークレットを使用します。RS256 では、秘密キーで署名し、公開キーで検証します。

非対称方式の署名では公開キーを公開できるため、他のサービスが署名シークレットを保持せずにトークンを検証できます。

var creds = new SigningCredentials(
    new RsaSecurityKey(rsaPrivateKey),
    SecurityAlgorithms.RsaSha256);

サービスの登録

トークンサービスを依存性注入に追加すると、エンドポイントやコントローラーに注入できるようになります。

builder.Services.AddScoped<TokenService>();

トークンは必要最小限かつ短期間に

トークンを発行する際のベストプラクティスは次の2つです。

  • 必要最小限: API が必要とするクレームだけを含めます。トークンはすべてのリクエストで送信されます。
  • 短期間: アクセストークンを5~15分にすると、漏えいした場合の被害を抑えられます。
expires: DateTime.UtcNow.AddMinutes(15)

確認問題

トークンの発行について学んだ内容を確認します。

まとめ

署名付き JWT を発行しました。

  • SigningCredentials でキーとアルゴリズムを組み合わせます。
  • Claim のリストを構築し、発行者、オーディエンス、有効期限を指定した JwtSecurityToken を作成します。
  • JwtSecurityTokenHandler.WriteToken でコンパクトな文字列にシリアライズします。
  • トークンは必要最小限にし、有効期間を短くします。

次は、リフレッシュトークンと有効期限の戦略です。

よくある質問

「トークンの発行」レッスンは無料ですか?

はい。「トークンの発行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「トークンの発行」で何を学びますか?

ログイン時に署名済みトークンを生成します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「トークンの発行」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JWTの構造とクレーム
  2. JWT Bearer認証の設定
  3. トークンの発行
  4. リフレッシュトークンと有効期限
← C# Academyに戻る