出典:https://www.cnblogs.com/pangjianxin/p/9372562.html
asp.net core2.1復号化、認証と認可
します。https://digitalmccullough.com/posts/aspnetcore-auth-system-demystified.htmlから翻訳この記事
Asp.net core2.0紙が読者に明確な説明を与えるために、どのように認証および承認システムの動作の概要を説明し、それが良いと感じているので、あなたの参考のための翻訳。
考え方の束の前ではと迷惑なチャタリングを停止し、私はテキストを開始し、アップにしないでください。
このシステムを理解するために最初にあなたは、その構成要素と動作を理解する必要があります。これらのコンポーネントは、アイデンティティ、動詞(またはアクション)、認証ハンドラとミドルウェアに分割されています。私はそこのコンポーネントのそれぞれに一つずつ説明し、彼らは後者の例で一緒にどのように機能するかを証明します。asp.net認証ハンドラコアのほとんどは、クッキー認証ハンドラであるため、この例では、クッキー認証を使用しているので。
身元
認証(認証)を理解するには、それがどのように動作するかで、我々は最初のasp.net core2.0にアイデンティティを理解しなければならないものです。クレーム、ClaimsIdentityとClaimsPrincipal:文章がユーザーのID(アイデンティティ)を表すための3つのクラスを持つことです。
請求
ユーザーの情報ポイントに代わって請求。これは要するに、それは情報利用者のポイントである、ユーザーの姓、ユーザー名、ユーザーの自宅住所、ユーザーの年齢やユーザーに関するその他の情報とすることができます。メッセージは一点のみを含むことができると主張しています。
クレームにasp.net core2.0でのクラスがあります。これは、最も一般的なコンストラクタは二つの文字列、タイプ、および値を受け取ります。クレームタイプパラメータは、値がこの項におけるユーザ情報の値が表現され、タイプまたは名前です。
たとえば、次のコードは、2件のクレームを作成し、前記「フルネーム」のタイプ、値「Pangjianxin」は、別のタイプClaimTypes.Emailは、ある[email protected]。
これは、請求項標準A //文字列使用する 新しい新しいクレーム(「フルネーム」、「ダークヘルメット」); クレームに//このタイプの拡充「をhttp://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress 「 新新クレーム(ClaimTypes.Email、 『[email protected]』); //デフォルトClaimTypesクレームの構築を容易にするために使用される定数の数が含まれています
ClaimsIdentity
アイデンティティ(アイデンティティ)識別の形に代わって、または別の言い方をするが、それはあなたが誰であるかを証明するための方法です。実生活では、アイデンティティはClaimsIdentityクラスですasp.netコアに、運転免許証することができます。このクラスは、身元証明のデジタル形式を表します。
ClaimsIdentity単一のインスタンスは、https://andrewlock.net/introduction-to-authentication-with-asp-net(アンドリュー・ロックのこの話して彼の資料によると、認証できません(認証済み)認定を受けることができClaimsIdentityで定義されるように-core /)、自動的にisAuthenticated(別の属性ClaimsIdentityの内部を確実にすることができる認証)属性値がtrueであるかどうかを決定する)(ルックAuthenticationType属性に単に提供されます。あなたはどのような方法でアイデンティティ(ClaimsIdentity)を認証することができた場合、(それは、定義により、認証を受ける必要があります。)認定されている必要があるためです。
見知らぬ人があなたに向かって来て、あなたが何らかの形で自分自身を紹介したい、あなたのために見知らぬ非認証CLaimsIdentityの同等。ロック(上記人、ロック)は、これが便利なのカートのゲスト(実際の生活の中で、あなたが着陸前にショッピングカートに何かを追加することができるかもしれ)、または他の類似のものであるかもしれないと書いています。ように姓、名、生年月日、および:運転免許証は、請求項の多くが含まれています。同様に、ClaimsIdentityは、ユーザに関する多くの項を含んでいてもよいです。
ClaimsPrincipal
本体(プリンシパル)が実際のユーザを表します。それはまた、など一つ以上のCLaimsIdentity、人が運転免許証、先生を持つことができるだけで実際の生活の中でのように、パスポートを含有することができる、彼はまた、IDカードを持っている必要があります。各文書(ClaimsIdentity)は、異なる目的のために及び請求の一意のセットを含んでいてもよいです。しかし、すべての文書が同じ人物を証明するためにさまざまな方法があります。
結論として、ユーザーに代わってCLaimsPrincipal、それが1つまたは複数のClaimsIdentityが含まれ、ClaimsIdentity彼らは身元の証明の形を表し、ClaimsIdentityだけでなく、請求項の1つまたは複数のユーザの情報ポイントに代わって請求が含まれています。ClaimsPrincipalはHttpContext.SiginAsync方法(正確、それが拡張メソッド)パラメータであり、AuthenticationHandler内部メソッドに送信されます。
動詞
動詞は動詞である、またはコマンドは、行動と呼ばれています。5の合計認証システムasp.netコア2.0(認証システム)で、それが呼び出され動詞、およびそれらが必要とされない呼程度です。彼らは別のコールであり、それらの間に相互作用はありません、一緒に使用する場合ただし、ユーザーがログインすると、ページにアクセスし、または拒否することができます。ここでは、関連する業務動詞これら5つの簡潔な説明は記事の詳細な説明で、後にも、次のとおりです。
注:これらの挙動、ない方法はありますが、これらの行為を命名同じことを達成するために、いくつかの方法があります
認証、認証
(例えば、ユーザの復号化クッキーとして)存在する場合には、情報へのユーザアクセス。
チャレンジ
これは、要求の認証プロセスをユーザーに要求する(例えば、ディスプレイのランディングページなど)
サインイン
ユーザに関する永続的な情報と(例えば書き込みクッキーなど)に置かどこか
サインアウト
ユーザが(例えばクッキーを削除など)の情報を持続している削除
禁じます
ユーザのための1つが認証されていない、それは、関連するリソースへのユーザアクセスを防ぐ認証するための別の場合そのような再としてユーザの十分な権限を(athorization承認に関するもの)(持つ、2例が含まれていページの「権限の不足」)に向かいます。
認証ハンドラ
認証ハンドラ(複数を留意されたい)である操作の上記5種類の実数成分。asp.netコアは、デフォルトの認証ハンドラはクッキー認証ハンドラで、このことは、上記の5つのアクションを達成することです提供します。なお、認証ハンドラは、上記のすべての操作(動詞)は、例えば、.NETコアに認可プロトコルのOAuthのOAuthハンドラは(契約のソースコンポーネントの実現が識別SERVER4、オープンソースコンポーネントで実装する必要はありません)認証プロトコルはOAuthの基礎を構築されており、接続のOpenIDを達成しながら、サインインアクションを実装するが、そのようなクッキー認証ハンドラとして、別の認証ハンドラに責任を渡しません。
使用(スキーム)と関連し、認証スキームするために、認証ハンドラは、認証システム(認証システム)に登録されなければなりません。スキームは、認証ハンドラ辞書のユニークな認証ハンドラを識別する文字列です。クッキー認証ハンドラの場合は、デフォルトのスキームは、「クッキー」ですが、彼は他の文字列に置き換えることができます。複数の認証処理プログラムは、供給された他の認証処理プログラム(上記のOAuthハンドラのように)時には、側によって使用される側であってもよいです。
認証ミドルウェア
ミドルウェアは、パイプキューの先頭に挿入することができ、すべてのそれらからのHTTP要求はされています。この記事は、唯一の認証ミドルウェアに興味があります。これらのコード(認証ミドルウェア)をチェックし、各ユーザが認証されているかどうかを要求、リコール、認証操作(ユーザから情報取得するためにクッキー)が、唯一のそのような情報の存在下に。認証ミドルウェアを開始する要求が代わって既定のプログラム呼び出したときに認証コードを実行するための認証ハンドラを。認証ハンドラの戻り情報認証ミドルウェアにし、その後に情報をパディング性質上HttpContext.User。
認証と承認フロー
正常リソースにアクセスするユーザを認証および承認できるようにするために、これらの構成要素の全ては、認証システムにおいて一緒に使用することができなければなりません。このプロセスは、保護へのアクセス要求によって開始された非認証されたユーザから起動するリソース(認証が必要)。
以下に示しクッキー認証ルーチン:
1、要求がサーバーに到達しました。
2、認証ミドルウェアの認証は、デフォルト・ハンドラとHttpContext.Use上にオブジェクトに含まれる任意の有用な情報のメソッドを呼び出します。
図3に示すように、要求は、コントローラのアクションの上部に到達します。
4、アクションがない場合は、[承認]装飾、直接ページと表示対応終了を要求することによって。
図5に示すように、アクションがある場合、[オーソライズ]変性、次いでフィルタ許可(認証フィルタ)、ユーザが前に認証されたかどうかをチェックします。
6、ユーザーが認証を持っていない場合、認証フィルタ(認証フィルタ)チャレンジアクション、適切なログイン認証ページへのリダイレクトを実行します。
7、ユーザーが正常に関連するページにアクセスするために(許可)権限のあるユーザーが許可されているかどうか、着陸後にバックフィルタのチェックをリダイレクトした後。
8、ユーザーはそれ以外の場合は禁じる行動を呼び出します、ページの表示には、アクセスを許可されている場合。
サンプルコード
この例では、フル機能のWebアプリケーションであることを意図していません。これは、ストアのユーザー名とパスワードに簡単なPOCOクラスを使用して、簡単に言えば、この記事の内容は、別の問題を示すことだけです。この例を説明するためには、認証プロセスです。例は何か、一度の独立を削除します。
起動クラス
アプリケーションが最初に起動したときには、起動クラスのConfigureServiceと設定方法をトリガーします。aspnetcore2.0では、認証ハンドラはConfigureServiceプロセスを構成しています。そして、この方法は、設定方法によってそれらの上に配置することができます。
公共のボイドConfigureServices(IServiceCollectionサービス){ サービスの収集と設定しに//追加のクッキーのミドルウェアそれ services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(オプション=> options.LoginPath =新PathString( "/アカウント/ログイン")); ... } 公共ボイド設定(IApplicationBuilderアプリ、IHostingEnvironmentのENV){ ... パイプラインに//追加認証ミドルウェア app.UseAuthentication()。 ... }
認証サービス(ミドルウェア?)のConfigureService方法AddAuthentication法では(DIシステム)上記ServicesCollectionに追加します。そして、認証Cookie認証ハンドラミドルウェアに追加する方法で呼び出しを連鎖させることができます。
中間パイプに認証UseAuthenticationの呼び出しを追加する設定方法では、あなたが各要求の認証を行うことができるように。
ApplicationUserクラス
アプリケーションは、ユーザークラスの代表が必要です。。この単純なクラスは、ユーザー名とパスワードを格納します。
パブリッククラスApplicationUser { 公共の文字列のユーザー名{取得します。セットする; } パブリック文字列のパスワード{取得します。セットする; } パブリックApplicationUser(){} 公共ApplicationUser(文字列名、文字列のパスワード){ this.UserName =ユーザ名; this.Password =パスワード; } }
AccountControllerクラス
意味のある何かに認証ミドルウェアおよびハンドラを使用するために、我々はいくつかのアクションをカバーしました。実行AccountController着陸およびログアウト方法の次の方法。HttpContextクラス(指定またはデフォルトのハンドラで)ログインおよびログアウトを行うために、いくつかの拡張メソッドを介してこのクラス(AccountController)メソッド呼び出しSiginAsyncとSignoutAsync。
パブリッククラスAccountController:コントローラー{ // Aは非常に単純なユーザーストア。これは、通常、データベースまたは同様であろう。 公衆リスト<ApplicationUser>ユーザー=>新しいリスト<ApplicationUser>(){ } ApplicationUser {ユーザー名= "darkhelmet"、パスワード= "ベスパ"新しい、 新規ApplicationUser {ユーザー名= "prezscroob"、パスワード= "12345"} }。 公共IActionResultログイン(文字列にreturnurl = NULL){ TempDataを[ "にreturnurl"] =にreturnurl。 リターンビュー(); } [HttpPost] 公共非同期タスク<IActionResult>ログイン(ApplicationUserユーザ、 IF(ユーザ== NULL){ リターンBadRequest(badUserNameOrPasswordMessage)。 } VAR lookupUser = Users.FirstOrDefault(U => u.UserName == user.UserName)。 もし(lookupUserみましょう。パスワード= user.Password?!){ リターンBadRequest(badUserNameOrPasswordMessage)。 } VARアイデンティティ=新しいClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme)。 identity.AddClaim(新しい項(ClaimTypes.Name、lookupUser.UserName))。 await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme、新しいClaimsPrincipal(アイデンティティ)); (にreturnurl == NULL){場合 にreturnurl = TempDataを[ "にreturnurl"]?。ToStringメソッド()。 } IF(!にreturnurl = NULL){ リターンリダイレクト(にreturnurl)。 } 戻りRedirectToAction(がNameOf(HomeController.Index)、 "ホーム")。 } パブリック非同期タスク<IActionResult>ログアウト(){ のawait HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme)。 リターンRedirectToAction(がNameOf(HomeController.Index)、 "ホーム")。 } }
まず、このクラスは、ユーザーのリストが含まれ、2によってログイン方法はTempDataを中にreturnurlと記憶するのパラメータを受け取る、オーバーロードされました。ユーザログインログイン第二の方法。ログイン方法は必ず入力したユーザーのログイン情報が有効であれば、彼はClaimsIdentityを作成し、有効であることを確認するために[HttpPost]に変更する方法を最初にチェックです。属性パラメータAuthenticationType ClaimsIdentityクラスのコンストラクタのセットを受け、このパラメータは、Identityがチェックされて表す任意の文字列を指定できます。
私はクッキー認証を使用していますので、私はちょうど認証スキームのクッキーを渡されました。しかし、あなたは彼に任意の値に設定することができます。後でロゴを使用する場合、私は私のアイデンティティの認証方法はの信頼を認証するかどうかを判断するために、このプロパティを使用することができます。
VaRのアイデンティティは新しいClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme)を=。 identity.AddClaim(新しい項(ClaimTypes.Name、lookupUser.UserName))。
そして、この方法はHttpContext.SignInAsync()を呼び出し、クッキー及び認証制度ClaimPrincipalは、渡されました。
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme、新しいClaimsPrincipal(アイデンティティ));
方法はにreturnurlを決定した場合にreturnurl最後に、それはにreturnurlにユーザーをリダイレクトし、そうでない場合は、ホームページにリダイレクトします。
(にreturnurl == NULL){場合 にreturnurl = TempDataを[ "にreturnurl"]?。ToStringメソッド()。 } IF(!にreturnurl = NULL){ リターンリダイレクト(にreturnurl)。 } 戻りRedirectToAction(がNameOf(HomeController.Index)、 "ホーム")。
Login.cshtml
でログインアクションコントローラに対応し、ログインページを作成します。
@model ApplicationUser @{ <form asp-antiforgery="true" asp-controller="Account" asp-action="Login"> User name: <input name="username" type="text" /> Password: <input name="password" type="password" /> <input name="submit" value="Login" type="submit" /> <input type="hidden" name="returnUrl" value="@TempData["returnUrl"]" /> </form> }
HomeController类
在HomeController类中创建一个Members方法,加上[Authorize]标签
[Authorize] public IActionResult Members() { return View(); }
[Authorize]特性会导致授权过滤器的调用。这个过滤器会决定用户是否已经登陆并且如果没有登陆会通过认证handler调用Challenge这个verb(动作),这个动作导致用户被要求登陆。
Members.cshtml
接下来创建Members对应的视图:
@{ ViewBag.Title = "Members Only"; } <h2>@ViewBag.Title</h2> <p>You must be a member. Congratulations, @User.Identity.Name, on your membership!</p>
_Layout.cshtml
最后,一个能够让用户点击的用来登陆或者登陆的按钮是非常有用的。
@if(User.Identity.IsAuthenticated) { <li><a asp-area="" asp-controller="Account" asp-action="Logout">Logout</a></li> } else { <li><a asp-area="" asp-controller="Account" asp-action="Login">Login</a></li> }
结论
認証システムは、デザインも非常に良いですが、非常に興味深いです。カスタム認証ハンドラを使用することは非常にスケーラブルで簡単です。ボンネットの下にどのようにシステムの仕事を理解し、最初のステップは、デフォルトのテンプレートに加えて、それを使用することです。コンポーネント自体を使用してではなく、テンプレートと便利な方法に頼ることで、カスタム認証プロセスのさまざまなを使用することができます。今それを使用!