まず、新しいプロジェクトの初期化
コントローラのフォルダに新しいAdminController.cs
ビューの設定
@ { ViewDataを[ " タイトル" ] = " 管理者" 。 } <H2> @ViewData [ " タイトル" </ H2> <P>管理ページ</ P>
ショーを実行します。
二、Cookieベースの認定
AdminController [承認]タブを追加するには1、
スペースを引用するヒントをすることができます。
2、クッキー依存性注入プロセスの起動
ConfigureServices下のメソッドを追加します
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(オプション => { // カスタム着陸アドレス、デフォルトのHTTPとして構成されていない場合:// localhostを:5000 /アカウント/ログイン options.LoginPath = " /アカウント/ mylogin " ; });
スペースを引用するヒントをすることができます。
その後、設定するには、クッキーのミドルウェアはまた、そうでない場合は、認証機関が力ではありませんが、中に追加のアプローチ
公共の 無効設定(アプリケーションIApplicationBuilder、IHostingEnvironment ENV) { IF (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } 他 { app.UseExceptionHandler(" /ホーム/エラー" ); } app.UseStaticFiles(); アプリケーション。 UseCookiePolicy(); // 注意app.UseAuthentication方法を使用し、かどうかの呼び出しの後ろの人はHttpContext.SignInAsyncユーザーがログオンした後でも、以下のapp.UseMvc方法の前に配置しなければならない // HttpContext.Userはまだユーザーがログインしていない表示され、 HttpContext.User.Claimsログオンしているユーザー情報を読んでいません。 //これは、シーケンスを呼び出す大きな衝撃Asp.Net OWINフレームミドルウェアは、システム機能は、各呼の順序が反ミドルウェアはならないであろうことを示して app.UseAuthenticationを(); app.UseMvc(ルート => { routes.MapRoute( 名前:" デフォルト" 、 テンプレート:" {コントローラ} =ホーム/インデックス= {アクション} / {?ID} " ); }); }
ここでapp.UseAuthenticationがやってするために使用される方法は、app.UseAuthenticationが認証ミドルウェアを有効にし、ミドルウェアは、これだけでは、情報(後で使用される)現在のCookieのHTTPリクエストをベースHttpContext.Userプロパティに設定されます。 app.UseAuthenticationメソッド上方強調表示された理由である、値にHttpContext.Userから読み取ることができるようにミドルウェアを登録app.UseAuthentication方法は、ASP.NETコアの唯一の方法であるため、以下app.UseMvc法の前に置かれなければならない後MVCミドルウェアはHttpContext.Userの値を読み取ります。
ディスカバリーは、アドレスにジャンプ自動的に上陸しました。
3、シミュレートされた着陸
一時着陸ない、ただ、最初AccountController.csを作成するどのような着陸をシミュレート
ログインおよびログアウトのための2つのAPIを追加
パブリック クラスAccountController:コントローラー { 公共IActionResult指数() { 戻ります(ビュー)。 } // 登陆 公共IActionResult MakeLogin() { VARのクレーム= 新しいリスト<項> (){ 新項(ClaimTypes.Name、" wangyuting " )、 新たなクレームを(ClaimTypes.Role、" 管理者" ) }。 // 必须要加CookieAuthenticationDefaults.AuthenticationScheme、不然无法解析 VARclaimsIdentity = 新しいClaimsIdentity(特許請求の範囲、CookieAuthenticationDefaults.AuthenticationScheme)。 HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme、新しいClaimsPrincipal(claimsIdentity)); 戻る[OK]を(); } // 登出 公共IActionResultログアウト() { HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme)。 戻る[OK]を(); } }
ASP.NET COREをFormsAuthentication従来の方法では、ログインユーザを使用して同じではない、以下の手順Cookie認証:
- へのユーザのログインに保存されている(ユーザ名など)の文字列のキー情報のすべてのタイプを主張、配列のクレームの種類を作成します
- 上記で作成したクレームの種類の着信ClaimsIdentityのアレイは、オブジェクトがClaimsIdentityを構築するために使用されています
- 着信ClaimsPrincipal上に作成ClaimsIdentityオブジェクト、ClaimsPrincipalを構築するために使用されるオブジェクト
- ユーザーログインを完了するには、上記で作成したClaimsPrincipalオブジェクトを渡し、HttpContext.SignInAsyncメソッドを呼び出し
だから我々は、全体のASP.NET COREのクッキー認証ログインプロセスがはるかに複雑FormsAuthentication.SetAuthCookie方法を取得する前に、すべての後に、以前にASP.NETをFormsAuthenticationたよりも見ることができます。
この記事の例では、コードのユーザーのログインを実装するために、メソッドAcionログインを作成したにHomeControllerプロジェクトのデフォルト。もちろん、私たちは、実際には、次のコードはまた、永続的なクッキーは、クッキーが長く、クッキーの名前が格納されているものログインユーザ情報を期限切れにする方法かどうかを最も簡単なログインクッキーを設定することができますされ、ここで実現し、我々はあまりにも導入しません、最後に、あなたはより多くのお勧め2の公式ドキュメントを読むことができます。
次のようにログインメソッドのコードは次のとおりです。
/// <まとめ> /// コアAsp.Netを記録するアクションWangdacuiユーザ /// </要約> 公共IActionResultログイン() { // 以下の特許請求の範囲は、可変項アレイ型で、キータイプString請求値のペアは、配列は、ユーザーに関する任意の数や情報を格納することができます主張し // ますが、この情報は暗号化され、クライアントのブラウザのクッキーに格納された後に注意を払う必要がありますので、それはあまりにも多くの情報が特に敏感で格納することが最善ではありませんここでは、特許請求の範囲のみアレイにユーザー名を格納 // 現在ログインしているユーザを表し VARの特許請求の範囲を= 新しい新規 [] { 新規新しいクレーム(「userNameに」、「Wangdacui 」)}; VARの claimsIdentity = 新しい新しいclaimsIdentity( 特許請求の範囲を、 CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipalユーザー = 新しい新しいClaimsPrincipal(claimsIdentity); Task.Run(非同期()=> { // ユーザログ、ASP.NET FormsAuthentication.SetAuthCookieに対応 ザが待つHttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme、ユーザ) ; // オーバーロードされたメソッドを定義するために使用することができるHttpContext.SignInAsync永続的なCookieストアユーザ認証情報、例えば、次のコードは、クッキー後60分以内にユーザーがログインを定義して、クライアントコンピュータのハードドライブ上に残ります // ユーザーが閉じた場合でも、ログオフログアウトメソッドを呼び出さない限り、60分以内に再びサイトにアクセスするためのブラウザは、まだログインしています。 // 注どのAllowRefreshプロパティ、AllowRefreshがtrueの場合、時間間隔ExpiresUtcの50%以上であればユーザーがログインしていること彼は、(実際には、クライアントコンピュータのハードディスク上のクッキー保持時間を延長する)ユーザーのログオン時間の延長上で、サイトを訪問した //この場合、例えば、我々は、ユーザが30分以上ログインし、60分未満がサイトを訪問したときに、ユーザーがログインした後、現在の時刻後60分に延長され、ExpiresUtc 60分に設定次のプロパティを持っています。しかし、30分以内に、ユーザは、ログイン時間を延長しませんサイトにアクセスするにはログインした後に // ASP.NETコアは必須要件があるため、ユーザーがサイトへの訪問によってExpiresUtc時間間隔の50%以上であり、かつ利用者を拡張することありませんログイン時間。 // AllowRefreshがクライアントへ60分、ユーザーのサイトへのアクセスの有無にかかわらず60分以内のログ、わずか60分で、非ログインに飛んだが、(クライアントコンピュータのハードドライブにクッキー保持時間を延長しないことを示し、falseの場合コンピュータは自動的にクッキーを削除します) / * ザは、(HttpContext.SignInAsyncを待つ CookieAuthenticationDefaults.AuthenticationScheme、 ユーザー、新しい新しいAuthenticationProperties() { isPersistent = trueに、 ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60)、 AllowRefresh = trueに }); * / })。待って(); 戻り値ビュー(); }
現在のHTTP要求は、ユーザAに記録されている場合は、今loginメソッドを呼び出すHttpContext.SignInAsync、ユーザB、ユーザAのキャンセルには、ユーザBのログイン
3.ログインユーザ情報を読みます
だから、ユーザーが(ユーザ名など)は、ユーザのログイン情報にログインするか、それから読み出さ?私たちは、現在のユーザーがログインしているかどうかを判断する方法を示し、ログインして、ユーザーのコードインデックスIndexメソッドを読み込むためのユーザー名が示す方法にHomeControllerに従います。
/// <要約> /// アクションは、ユーザーがすでにログインしている場合、ログインユーザ名を読み、ログインしたか否かを判断する /// </要約> 公共IActionResult指数() { // もしHttpContext.User.Identity 、真のよう.IsAuthenticated // またはHttpContext.User.Claims.Count()は0よりも大きい場合には、ユーザーがログインしていることを示している IF (HttpContext.User.Identity.IsAuthenticated) { // ログインで、このアクションによって、ここで私たちすることができますHttpContext.User.Claimsすべてのクッキーに保存されている // など私たちはここで定義Wangdacui UserNameの値が読み出されてきたように、値のペアを読み出すクレーム VARを userNameに= HttpContext.User.Claims.First()値;. } リターンビュー(); }
最高使用HttpContext.User.Identity.IsAuthenticatedはユーザーがログインしているかどうかを判断することに注意してください
ログアウト
それでは、どのようにログオンしているユーザーをログオフしますか?私たちは、次のようにコードは、ユーザーがログオフする方法のログアウト方法にHomeControllerを示します。
/// <要約> /// ユーザーがAsp.Netコア内のアクションからログオフ /// </要約> 公共IActionResultジンバブエログアウト() { Task.Run(非同期()=> { // ユーザーのログオフASP.NETに対応FormsAuthentication.SignOutは ザは待つ)(HttpContext.SignOutAsync; 。})待ち(); 戻りビュー(); }
現在のHTTP要求は一切ログインユーザを持っていないだろう場合はメソッドを呼び出すときに、またHttpContext.SignOutAsync与えられていません