SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET Identity入門

ASP.NET 5に向けて知っておきたい、最新のASP.NET Identityのポイント

ASP.NET Identity入門 第14回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Eメール、SMS送信の設定

 パスワードリセット、二要素認証などでEメール、SMSを送信するには、MessageServices.csファイルに定義されたAuthMessageSenderクラスを実装します(リスト4)。

リスト4 EメールやSMSの送信設定を行う箇所(Services/MessageServices.csより)
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
// For more details see this link http://go.microsoft.com/fwlink/?LinkID=532713
public class AuthMessageSender : IEmailSender, ISmsSender   // (1)
{
  public Task SendEmailAsync(string email, string subject, string message)  //(2)
  {
    // Plug in your email service here to send an email.
    return Task.FromResult(0);
  }

  public Task SendSmsAsync(string number, string message) //(3)
  {
    // Plug in your SMS service here to send a text message.
    return Task.FromResult(0);
  }
}

public interface IEmailSender //(4)
{
  Task SendEmailAsync(string email, string subject, string message);
}

public interface ISmsSender //(5)
{
  Task SendSmsAsync(string number, string message);
}

(1)AuthMessageSenderクラスを定義

 (4)、(5)の箇所で宣言したIEmailSender、ISmsSenderインターフェースを実装し、AuthMessageSenderクラスを定義します。

(2)メール送信処理を実装

 IEmailSender.SendEmailAsyncメソッドを実装し、メール送信処理を行います。本連載の第4回を参考に実装すればよいでしょう。

(3)SMS送信処理を実装

 メール送信と同様に、ISmsSender.SendSmsAsyncメソッドを実装します。

 Eメール、SMS以外の手段(例えばTwitterのダイレクトメッセージなど)でメッセージを送りたい場合は、IEmailSenderインターフェースなどと同様にIXxxSenderインターフェースを宣言し、AuthMessageSenderクラスに実装すればよいでしょう。

ログイン、ログアウト処理

 ログイン、ログアウト処理はAccountControllerクラスに集約されています(リスト5)。

リスト4 EメールやSMSの送信設定を行う箇所(Services/MessageServices.csより)
[Authorize]
public class AccountController : Controller
{
  private readonly UserManager<ApplicationUser> _userManager;
  private readonly SignInManager<ApplicationUser> _signInManager; //(1)
  private readonly IEmailSender _emailSender;
  private readonly ISmsSender _smsSender;
  private readonly ApplicationDbContext _applicationDbContext;
  private static bool _databaseChecked;

  public AccountController(
      UserManager<ApplicationUser> userManager,
      SignInManager<ApplicationUser> signInManager,
      IEmailSender emailSender,
      ISmsSender smsSender,
      ApplicationDbContext applicationDbContext)
  {
    _userManager = userManager;
    _signInManager = signInManager;
    _emailSender = emailSender;
    _smsSender = smsSender;
    _applicationDbContext = applicationDbContext;
  }

  //
  // POST: /Account/Login
  [HttpPost]
  [AllowAnonymous]
  [ValidateAntiForgeryToken]
  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
  {
    EnsureDatabaseCreated(_applicationDbContext);
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
      // This doesn't count login failures towards account lockout
      // To enable password failures to trigger account lockout, set lockoutOnFailure: true
      var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);  //(2)
      if (result.Succeeded)
      {
        return RedirectToLocal(returnUrl);
      }

      ...(略)...
    }

    // If we got this far, something failed, redisplay form
    return View(model);
  }

  ...(略)...

  //
  // POST: /Account/LogOff
  [HttpPost]
  [ValidateAntiForgeryToken]
  public IActionResult LogOff()
  {
    _signInManager.SignOut(); //(3)
    return RedirectToAction(nameof(HomeController.Index), "Home");
  }

  ...(略)...
}

(1)ログイン/ログアウト処理用フィールドを定義

 ログイン/ログアウト処理を委譲するSignInManagerクラスのフィールドを定義します。フィールドの値はコンストラクターで外部から注入します。

(2)ログイン処理

 Loginメソッドの中で、SignInManagerクラスのPasswordSignInAsync非同期メソッドを呼び出し、ログイン処理を行います。内部ではユーザー名、パスワードを使ってユーザー情報を取得し、取得したユーザー情報を元に認証チケットを作成してCookieに設定しているのは、従来のASP.NET Identityと変わりません。

(3)ログアウト処理

 Logoutメソッドの中で、SignInManagerクラスのSignOutメソッドを呼び出してログアウト処理を行います。内部ではCookieに設定した認証チケットをクリアしています。

 その他のユーザー登録処理やパスワードリセットなどの機能についても、すべてAccountControllerに実装例が書かれていますので、興味があればじっくりとコードを見てみるとよいでしょう。また、二要素認証の実装方法など、より詳細な内容は参考資料3)のASP.NET 5公式ドキュメントを参照してみてください。

まとめ

 次世代のASP.NET 5におけるASP.NET Identityのポイントを、プレビュー版のテンプレートを元に紹介してきました。今回の内容をまとめると、次のようになります。

  • ASP.NET 5は次のような内容をめざしてオープンソースで開発が進められている
    • LinuxやMac OS Xを含むクロスプラットフォーム
    • OWINを新たに再実装したミドルウェア、パイプライン処理
    • サービス単位でのDI
    • 非同期処理
  • ASP.NET Identityの次のバージョン3.0もASP.NET 5本体と同様にオープンソースで開発が進められている
    • ASP.NET 5ミドルウェアによるCookie認証
    • ASP.NET 5のDIによるASP.NET Identityサービス登録
  • Eメール等のメッセージ送信はASP.NET Identityの機能ではなく独自に実装
  • テンプレートではAccountController.csにログイン、ログアウトを始めとしたユーザー管理処理が集約されている

 さて、第1回から1年以上に渡る本連載も、今回で最終回です。連載ではテンプレートによって生成されたASP.NET Webフォームのコードを中心に説明してきましたが、基本的な概念などはMVC等でも変わりません。実際の製品、システムに組み込むには、テンプレートをそのまま使うわけにはいきませんが、それでもテンプレートから参考にしたり、流用できたりする部分も多いはずです。ぜひご自分が担当するアプリケーションでも、ASP.NET Identityを活用してみてください。

 また、今回の記事で紹介したように、次世代のASP.NET 5でもその知識は十分に活用できます。ASP.NET 5は対象範囲も広く、最新情報を追うのが少し大変です。それでも、その中にASP.NET Identityも含まれているということも覚えておき、今後も最新のASP.NET Identityの動向に注目していってください。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET Identity入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8966 2015/10/08 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング