記事詳細


投稿日
2025年11月27日06時55分
タイトル

認証アプリ開発(Visualstudio2022community)本番での登録〜確認メール送信

内容

ここでは ASP.NET Core MVC + Identity を使って、
「ユーザー登録 → 確認メール送信 → メール内リンククリック後のアカウント有効化」
までを行う、本番運用を意識したサンプル構成 をまとめます。

著作権の関係で Visual Studio の自動生成コードをそのまま全文は載せられませんが、
必要なポイントと主要コード例 を組み合わせれば、すぐに動くプロジェクトを作れます。

1. プロジェクト作成

  1. Visual Studio 2022 Community
    • 新規プロジェクト → ASP.NET Core Web アプリケーション (Model-View-Controller)
    • 認証: 個別ユーザーアカウント を選択
    • .NET 6 以上を推奨(LTS)

2. Identity のメール確認を有効化

Program.cs(または Startup.cs)で設定します。

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
{
    options.SignIn.RequireConfirmedAccount = true; // メール確認必須
})
.AddEntityFrameworkStores<ApplicationDbContext>();

3. メール送信サービスの実装

本番では SendGrid や SMTP を利用します。
例: SMTP(Gmail の場合)

public class SmtpEmailSender : IEmailSender
{
    private readonly IConfiguration _config;
    public SmtpEmailSender(IConfiguration config) => _config = config;

    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        using var client = new SmtpClient();
        client.Host = _config["Smtp:Host"];
        client.Port = int.Parse(_config["Smtp:Port"]);
        client.EnableSsl = true;
        client.Credentials = new NetworkCredential(
            _config["Smtp:User"], _config["Smtp:Pass"]);

        var mail = new MailMessage
        {
            From = new MailAddress(_config["Smtp:From"]),
            Subject = subject,
            Body = htmlMessage,
            IsBodyHtml = true
        };
        mail.To.Add(email);

        await client.SendMailAsync(mail);
    }
}

Program.cs に登録:

builder.Services.AddTransient<IEmailSender, SmtpEmailSender>();

appsettings.json に設定:

"Smtp": {
  "Host": "smtp.gmail.com",
  "Port": "587",
  "User": "youraccount@gmail.com",
  "Pass": "app-password",
  "From": "youraccount@gmail.com"
}

4. 登録時のメール送信処理

Areas/Identity/Pages/Account/Register.cshtml.cs の OnPostAsync 内で、
ユーザー作成後に確認メールを送信します。

var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
    "/Account/ConfirmEmail",
    pageHandler: null,
    values: new { userId = user.Id, code },
    protocol: Request.Scheme);

await _emailSender.SendEmailAsync(
    Input.Email,
    "Confirm your email",
    $"<p>アカウントを有効化するには <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>こちら</a> をクリックしてください。</p>");

5. 確認リンククリック後の処理

Areas/Identity/Pages/Account/ConfirmEmail.cshtml.cs にて:

public async Task<IActionResult> OnGetAsync(string userId, string code)
{
    if (userId == null || code == null) return RedirectToPage("/Index");

    var user = await _userManager.FindByIdAsync(userId);
    if (user == null) return NotFound("ユーザーが見つかりません。");

    code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
    var result = await _userManager.ConfirmEmailAsync(user, code);

    return Page();
}

6. 本番運用の注意点

  • SMTP 認証情報は環境変数や Azure Key Vault で管理
  • HTTPS 必須(app.UseHttpsRedirection()
  • メール送信は非同期キュー(Hangfire, Azure Queue)

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Others
編集 | 記事一覧