Asp.net-core-log-in-and-log-out
ASP.NET Core-ログインとログアウト
この章では、ログインおよびログアウト機能について説明します。 ログアウトは、ログインに比べて実装がかなり簡単です。 いくつかのリンクを持つUIを構築したいので、レイアウトビューに進みましょう。 これにより、サインインしているユーザーがログアウトでき、ユーザー名も表示されます。
- 匿名ユーザーの場合、ログインリンクが表示されます。
- このUIを構築するために必要なすべての情報は、Razorビューコンテキストから入手できます。
- まず、レイアウトビューに名前空間 System.Security.Claims を追加しましょう。
- すべてのRazorビュー内で使用可能なUserプロパティがあり、ログインしているユーザーの名前を表示するUIを作成します。 拡張メソッド IsSignedIn もここで利用できます。
- このメソッドを呼び出すことができます。trueが返された場合、ここにユーザー名を表示するためのマークアップを配置し、ログアウトボタンを表示できます。
- ユーザーがサインインしている場合、ヘルパーメソッド GetUserName を使用してユーザーのユーザー名を表示できます。
- フォーム内にログアウトボタンを作成し、Webサーバーに投稿する必要があります。 これは、単純なGET REQUESTを許可してユーザーを許可する場合、特定の好ましくない条件を作成するため、実行する必要があります。
- これを強制的に投稿します。ユーザーがこのフォームを送信すると、必要な作業は、Logoutアクションを実行するだけです。これはAccountControllerを介して実装し、ユーザーをログアウトします。
- ユーザーがサインインしておらず、匿名ユーザーがいる場合は、AccountController、具体的にはLoginアクションに移動するリンクを表示する必要があり、Loginというテキストを表示できます。
- また、新規ユーザーが登録して直接登録ページに移動するためのリンクを追加する必要があります。
次のプログラムのように、AccountControllerに移動してログアウトアクションを最初に実装しましょう。
- このアクションは、HttpPostにのみ応答します。 これは非同期アクションです。 Identityフレームワークで別の非同期メソッドを呼び出す必要があります。
- IActionResultのタスクを返すことができ、アクションの名前はLogoutです。
- ログアウトするために必要なことは、* SignInManagerのSignOutAsync *メソッドを待つことだけです。
- ユーザーコンテキストが変更されました。これで匿名ユーザーができました。 ビューはホームページにリダイレクトされ、従業員のリストに戻ります。
次に、ログイン機能を構築していきましょう。 ここでは、HttpGetリクエストに応答してログインに使用できるフォームを表示するアクションと、HttpPostリクエストに応答するアクションのペアが必要になります。
まず、ログインは登録とは非常に異なるため、ログインデータを取得する新しいViewModelが必要です。 そこで、新しいクラスを追加して、 LoginViewModel と呼びましょう。
- ユーザーがログインするとき、ユーザー名、パスワードなどの情報を提供する必要があります。
- 3番目の情報はログインUIでなければなりません。 これらには、「私を覚えておいてください」という小さなチェックボックスが付いています。 これは、セッションCookieを使用するか、より永続的なCookieを使用するかの選択です。
- この機能を許可するために、ブールプロパティ RememberMe を追加し、Display注釈を使用しました。 ラベルを作成すると、 Remember Meというテキストがスペース付きで表示されます。
- このViewModelの一部として実際に必要な最後の情報は、ReturnUrlを格納するプロパティを持つことです。
次のプログラムに示すように、Getリクエストに応答するLoginアクションを追加しましょう。
クエリ文字列にあるパラメーターとして returnUrl を使用します。
returnUrl は常に存在するとは限りません。 デフォルトとして空の文字列を用意しましょう。
中央のペインで、MVCビューページを選択してLogin.cshtmlを呼び出し、[追加]ボタンをクリックします。 Login.cshtmlファイルに次のコードを追加しましょう。
- このログインビューでは、ページのタイトルをLoginに設定し、 AccountLogin アクションに投稿するフォームがあります。
- タグヘルパー asp-route-returnurl を使用して、フォームがポストバックするURLにReturnUrlがあることを確認する必要があります。
- そのReturnUrlをサーバーに送り返す必要があります。これにより、ユーザーが正常にログインした場合に、目的の場所に送信できるようになります。
- asp-route-、id、またはreturnurlの後に追加するものはすべて、そこにあるものは何でも、URLパスまたはクエリ文字列パラメーターのいずれかで要求に送られます。
- ValidationSummary と、ユーザー名、パスワード、RememberMeの入力があり、[送信]ボタンがあります。
`* AccountController *、およびPostアクションを実装します。 HttpPostに応答するこのアクション。 Identityフレームワークを呼び出してタスクまたはIActionResultを返す必要があるため、これはAsyncメソッドになります。
- これをLoginと呼び、LoginViewModelを受け取ることを期待しています。
- ModelStateが有効かどうかを確認する必要があります。 有効な場合は、SignInManagerでAPIを呼び出してユーザーをサインインします。
- PasswordSignInAsync メソッドは結果を返し、結果が成功した場合、ユーザーが正常にログインしたことがわかります。
- リターンURLもあります。 有効なローカルURLである場合、戻りURLにリダイレクトされます。
- ユーザーがログインしたばかりで特定の場所がない場合、HomeControllerのIndexアクションにユーザーをリダイレクトします。
- ユーザーが無効なパスワードまたは無効なユーザー名を提供する場合があります。 また、無効なログインの試行がある場合にプロンプトを出すモデルエラーを追加する必要があります。 これにより、ユーザーは何かがうまくいかなかったかどうかを知ることができます。
ここですべてを保存して、アプリケーションを実行しましょう。
ログインと登録のリンクができました。 [ログイン]リンクをクリックします。
「ログイン」ボタンをクリックすると、ローカルホストのパスワードを保存するかどうかを尋ねるブラウザが表示されます。 [はい]ボタンをクリックします。
ここで、[ログアウト]ボタンをクリックしてログアウトします。
匿名ユーザーとして、従業員の詳細を編集してみましょう。
これで、* Loginビュー*にリダイレクトされたことを確認できます。
ユーザー名とパスワードを使用してログインし、Remember Meチェックボックスをオンにします。
次に、[ログイン]ボタンをクリックします。
これで、編集するURLにリダイレクトされていることがわかります。 これは、リターンURLを適切に処理したためです。