C#でAPIを作るなら、 JWT(JSON Web Token) による認証はほぼ必須です。 Web API、デスクトップアプリ、モバイルアプリ、クラウド連携など、 あらゆる場面で使われています。
この記事でわかること
・JWTの仕組み(Header / Payload / Signature)
・C#でのJWT発行(署名付き)
・ASP.NET Core Web APIでのJWT認証
・ロール(権限)管理
・リフレッシュトークンの考え方
・業務アプリ向けセキュリティ設計
・JWTの仕組み(Header / Payload / Signature)
・C#でのJWT発行(署名付き)
・ASP.NET Core Web APIでのJWT認証
・ロール(権限)管理
・リフレッシュトークンの考え方
・業務アプリ向けセキュリティ設計
1. JWTとは?(超要点)
JWTは、次の3つを「.」でつないだ文字列です。
Header.Payload.Signature
- Header:署名方式(例:HS256)
- Payload:ユーザー情報(例:UserId, Role)
- Signature:改ざん防止の署名
JWTはサーバー側でセッションを持たず、 トークンそのものに情報を持たせるのが特徴です。
2. C#でJWTを発行する(HS256)
■ 2-1. 必要なパッケージ
dotnet add package System.IdentityModel.Tokens.Jwt
■ 2-2. トークン発行コード
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;
using System.Text;
public string GenerateJwt(string userId)
{
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey12345"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userId),
new Claim("role", "Admin")
};
var token = new JwtSecurityToken(
issuer: "your-app",
audience: "your-app",
claims: claims,
expires: DateTime.UtcNow.AddHours(1),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
署名キーは必ず長く・複雑にするのが鉄則です。
3. ASP.NET Core Web APIでJWT認証を有効化
■ 3-1. Program.cs に認証設定を追加
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your-app",
ValidAudience = "your-app",
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes("YourSecretKey12345"))
};
});
builder.Services.AddAuthorization();
■ 3-2. 認証ミドルウェアを有効化
app.UseAuthentication();
app.UseAuthorization();
■ 3-3. 認証が必要なAPI
[Authorize]
[HttpGet("secure")]
public IActionResult SecureEndpoint()
{
return Ok(new { Message = "認証成功" });
}
Bearer トークンを付けて呼び出すとアクセスできます。
4. ロール(権限)管理
■ 4-1. JWTにロールを含める
new Claim(ClaimTypes.Role, "Admin")
■ 4-2. ロール制限付きAPI
[Authorize(Roles = "Admin")]
[HttpGet("admin")]
public IActionResult AdminOnly()
{
return Ok("管理者専用API");
}
ロール管理は業務アプリで非常に重要です。
5. リフレッシュトークン(長期ログイン)
JWTは短命(1時間など)にし、 長期ログインはリフレッシュトークンで実現します。
■ リフレッシュトークンの特徴
- DBに保存する(JWTは保存しない)
- 長い有効期限(7日〜30日)
- 再発行時に古いトークンを無効化
セキュリティを高めるための必須パターンです。
6. デスクトップアプリ(WPF/WinForms)でのJWT利用
デスクトップアプリでも、 API呼び出し時にBearerトークンを付与するだけでOKです。
■ 6-1. HttpClientでBearerトークンを付与
_http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", jwtToken);
ログイン後にトークンを保持し、API呼び出しに利用します。
7. セキュリティ強化のポイント(実務)
- 署名キーは長く・複雑に(最低32文字)
- JWTは短命(15分〜1時間)
- 長期ログインはリフレッシュトークンで
- HTTPS必須(平文送信はNG)
- ロール・権限をJWTに含める
- ログイン試行回数の制限
- ログ(Serilog)で認証イベントを記録
まとめ:JWTは“軽量で強力な認証基盤”になる
- JWT → API認証の標準
- ASP.NET Core → 認証ミドルウェアが強力
- ロール管理・リフレッシュトークンで実務に耐える
- デスクトップアプリ・モバイルでも使える
「APIを安全にしたい」「ログイン機能を作りたい」 というニーズに対して、 JWTは最も実務的で強力な選択肢です。 この記事をベースに、あなたのアプリに最適な認証基盤を設計してみてください。