アレがアレでアレ

(できれば)プログラミング関係のことを書きたい

ASP.NET フォーム認証

簡単なログイン機能を実装する時のメモ

認証チケットって

認証された際に発行される資格情報。
クッキーに保存され、以降はこの認証チケットを使って認証済みページにアクセスできる。

フォーム認証の準備

Web.configに以下を記入

<system.web>
    ...
    <authentication mode="Forms">
      <forms loginUrl="~/login" timeout="1440" name="auth"/>
    </authentication>
    ...
</system.web>
  • loginUrl: 認証されてない場合のリダイレクト先
  • timeout: 認証チケットの有効期限
  • name: クッキーの名前を指定

cookieless="UseUri"と指定すると認証チケットをクッキーで管理せずURLで持つこともできる。

実装のサンプル

コントローラー

public class HomeController : Controller
{

    [Route]
    public ActionResult Index() => View();

    // 新規登録ページ。認証済みでないとアクセスできない。
    [Route("new")]
    [Authorize]
    public ActionResult New() => View();

    /// ログイン画面
    [Route("login")]
    public ActionResult Login()
    {
        // 既に認証済みであれば、トップページへ
        if (HttpContext.User.Identity.IsAuthenticated)
            return Redirect("/");
            
        return View("Login");
    }

    /// ログイン処理
    [HttpPost]
    [Route("login")]
    public ActionResult Login(User user, string returnUrl = "/")
    {
        // なんらかのチェック
        if (canLogin(user))
        {
            // 認証成功 -> 認証チケットを発行し、本来遷移するはずのURLへリダイレクト
            FormsAuthentication.SetAuthCookie(user.Name, false);
            return Redirect(returnUrl);
        }

        return View("Login");
    }

    /// ログアウト処理
    [Route("logout")]
    public ActionResult Logout()
    {
        if (HttpContext.User.Identity.IsAuthenticated)
            FormsAuthentication.SignOut();
        return Redirect("/");
    }
}

アクションにAuthorize属性を付けることで認証されていないクライアントのアクセス拒否ができる。 アクセス拒否されると、Web.configで指定したログインページにリダイレクトされる。

アクション単位だけでなく、コントローラー全体に付けることもできる。 その際、AllowAnonymousを指定すると認証されていなくてもアクセスできるアクションを作れる。

[Authorize]
public class HomeController : Controller
{
    // 認証しなくてもアクセスできる
    [Route]
    [AllowAnonymous]
    public ActionResult Index() => View();
    
    [Route("new")]
    public ActionResult New() => View();
}

認証処理

ログインフォームから送られてきたパラメータをなんらかのチェックをして、
問題なければ、FormsAuthentication.SetAuthCookie()で認証チケットを発行しクッキーに保存。
以降、Authorize属性のアクションにもアクセス可能になる。

認証済みかどうかはHttpContext.User.Identity.IsAuthenticatedで確認できます。

FormsAuthentication.SignOut()でログアウト。

とっても簡単だね。

おわり。