トークンの発行
ログイン時に署名済みトークンを生成します。
「トークンの発行」は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フィードバックを取得できます。ローカル設定は不要です。