オリジナルます。https://chrissainty.com/securing-your-blazor-apps-configuring-policy-based-authorization-with-blazor/
では前の記事、私はロールベースBlazor WebAssembly(Blazorクライアント)アプリケーションの承認に追加する方法を示しました。この記事では、私はBlazorのconfigureポリシーベースの認証を使用する方法を紹介します。
ポリシー・ベースの許可
ASP.NETコアは、認可ルールのポリシーベースの認可を作成するために、より柔軟にすることができます。ポリシー権限コンセプトは3つのコンポーネントで構成されています。
- ポリシー -ポリシーは、一つ以上の要件があります。
- 要件 -現在のユーザープリンシパルデータ収集のパラメータを評価するための戦略。
- ハンドラ -現在のユーザーが、要求されたリソースを被写体へのアクセスを有するかどうかを決定するために使用される処理プログラム。
アプリケーションの起動時の戦略は、通常、Startup
クラスのConfigureService
登録プロセスを。
services.AddAuthorization(設定=> { config.AddPolicy(" IsDeveloper "、ポリシー=> policy.RequireClaim(" IsDeveloper "、" 真" )); });
上記の例では、ポリシーがIsDeveloper
持っているユーザーのニーズを必要とするIsDeveloper
声明、および値をtrue
。
ロール認可のように、あなたは同じ使用できるAuthorize
属性は、ポリシーの認可に適用されます。
[ルート(" API / [コントローラー] " )] [ApiController] パブリック クラスシステムコントローラ { [承認(ポリシー = 「IsDeveloper」)] パブリックIActionResult LoadDebugInfo() { // ... } }
Blazors命令およびコンポーネントも同じ戦略を使用することができます。
@page " /デバッグ" @attribute [オーソライズ(政策 = " IsDeveloper ")]
<AuthorizeViewポリシー= " IsDeveloper " > <P>あなただけ見ることができ、これを あればあなたはIsDeveloperポリシーを満たしています。</ p> </ AuthorizeView>
管理が容易
ポリシーベースの認可の最大の利点は、権限管理アプリケーションを改善することです。使用ロール・ベースの許可、我々は二つの役割を持っている場合は、アクセス保護されたリソースに許可されている-などadmin
とmoderator
。私たちは、それぞれがアクセス許可されているリソースを追加する必要があるAuthorize
プロパティを。
[承認(ロール= " 管理者、司会者")]
これは、初めに悪く見えませんが、新しい必要が生じた場合には、第三の役割はsuperuser
、同じアクセス権は、どのようにそれを行う必要がありますか?今、私たちは、各アクセスリソースに役割のすべてを更新する必要があります。ポリシーベースの検証を通じ、我々はこのような状況を回避することができます。
私たちは一つにポリシーを定義し、それが必要とするすべてのリソースに適用することができます。必要性は追加の役割を追加するとき、私たちは、各リソースを更新する必要なしに、このポリシーを更新する必要があります。
公共 ボイドConfigureServices(IServiceCollectionサービス) { services.AddAuthorization(設定 => { config.AddPolicy(" IsAdmin "、ポリシー=> policy.RequireRole(" 管理者"、" 司会者"、" スーパーユーザ" )); }); }
[承認(ポリシー= " IsAdmin ")]
カスタム要件を作成します。
ポリシーの認証を使用すると、役割ベースの要件、書類を作成し、さらにカスタム要件を作成することができ、非常に柔軟です。カスタム要件を作成する方法で見てみましょう。
通常は、あなたが複雑なロジックを持っているとき、私たちは、カスタムのニーズを使用しています。前述したように、我々は、需要と使用ポリシーの認可をトップハンドラを必要とします。
のは、ユーザーの電子メールアドレスは、会社のドメインの需要かどうかのチェックを作成してみましょう。私たちは、認可需要クラスを作成する必要があり、このクラスが実装する必要がありIAuthorizationRequirement
、それはちょうど空のマーカーインタフェースです、インタフェースを。
パブリック クラスCompanyDomainRequirement:IAuthorizationRequirement { 公共の 文字列 CompanyDomain { 取得します。} 公共 CompanyDomainRequirement(ストリングcompanyDomain) { CompanyDomain = companyDomain。 } }
次に、我々は我々の需要から継承するクラスを作成する必要がありAuthorizationHandler
ハンドラは、T
需要に対処するためです。
パブリック クラス CompanyDomainHandler:AuthorizationHandler <CompanyDomainRequirement> { 保護 オーバーライドタスクHandleRequirementAsync(AuthorizationHandlerContextコンテキスト、CompanyDomainRequirement要件) { 場合(!context.User.HasClaim(C => c.Type == ClaimTypes.Email)) { リターンTask.CompletedTask。 } VAR EMAILADDRESS = context.User.FindFirst(C => c.Type == ClaimTypes.Email).Valueの。 もし(emailAddress.EndsWith(requirement.CompanyDomain)) { リターンcontext.Succeed(要件)。 } リターンTask.CompletedTask; } }
上記のコードでは、電子メールの声明をチェック。もしそうなら、我々はそれが必要に応じて指定されたドメインで終わるかどうかをチェックして、そう、成功が返された場合、それ以外の場合は失敗します。
私達はちょうど戦略は、それに関連付けられている、と私たちの要求をしたいCompanyDomainHandler
依存性注入コンテナに登録します。
公共 ボイドConfigureServices(IServiceCollectionサービス) { services.AddAuthorization(設定 => { config.AddPolicy(" IsCompanyUser "、ポリシー=> policy.Requirements.Add(新しい CompanyDomainRequirement(" newco.com " ))); }); services.AddSingleton <IAuthorizationHandler、CompanyDomainHandler> (); }
カスタム要件の詳細については、我々は、チェックアウトをお勧め公式ドキュメントを。
Blazorの使用ポリシー
今、私たちは戦略が何であるかを理解していること、のアプリケーションでそれらを使用する方法を見てみましょう。
記事のBlazorアプリケーションでは、ポリシーベースの認可に切り替わります。この取り組みの一環として、我々は共有プロジェクトにポリシーを定義し、サーバーとクライアントでそれらを参照することができ、ポリシーベースの認可の別の利点を、表示されます。
共有ポリシーを作成します。
シェアでポリシーを作成する前にこのプロジェクトは、我々はNuGetのインストールを開始する必要がありMicrosoft.AspNetCore.Authorization
、このパッケージを。
インストール後、名前の作成するために、次のコードを使用Policies
するクラスを。
パブリック 静的 クラスポリシー { 公共 のconst 文字列 IsAdmin = 「IsAdmin 」。 公共 のconst 文字列 IsUser = " IsUser " 。 公共の 静的AuthorizationPolicy IsAdminPolicy(){ リターン 新しいAuthorizationPolicyBuilder()RequireAuthenticatedUser()。 .RequireRole(" 管理者" ) .Build(); } パブリック 静的AuthorizationPolicy IsUserPolicy(){ 返す 新しいAuthorizationPolicyBuilderを()RequireAuthenticatedUser()。 .RequireRole(" ユーザー" ) .Build(); } }
私たちは、最初の2つの定数を定義IsAdmin
してIsUser
。とき登録ポリシー私たちはそれらを使用します。次は、戦略そのものである、IsAdminPolicy
とIsUserPolicy
。ここで私が使用してAuthorizationPolicyBuilder
各ポリシーを定義するために、2つのポリシーを認証するようにユーザーに要求し、ポリシーに応じて、ユーザーがかもしれAdmin
役割とUser
役割。
サーバーを設定します
今、私たちはポリシーが定義されていることを、我々はそれらを使用するには、サーバーようにする必要があります。まず、Startup
クラスConfigureServices
登録ポリシーメソッド、AddAuthentication
次のコードを追加した後。
services.AddAuthorization(設定=> {
config.AddPolicy(Policies.IsAdmin、Policies.IsAdminPolicy());
config.AddPolicy(Policies.IsUser、Policies.IsUserPolicy());
});
コードは非常に簡単に理解することです、我々は使用Policies
魔法の文字列を使用して自分の名前を宣言し、各ポリシーを登録するには、クラスで定義された定数、回避します。
ではWeatherForecastController
、あなたが使用することができますIsAdmin策略代旧的角色。
[ApiController] [ルート(" [コントローラー] " )] [承認(ポリシー = Policies.IsAdmin)] パブリック クラス WeatherForecastController:ControllerBase
同様に、我々は一定の魔法の文字列を避けるために名前を使用することができます。
クライアントの設定
サーバーは現在、次のステップはBlazorクライアントでそれらを使用することで、定義された私たちの新しい戦略を使用することができます。
そして、サービス側、我々はしているStartup
クラスのConfigureServices
登録ポリシーアプローチ。我々は以前と呼ばれているAddAuthorizationCore
ので、それだけを更新する必要があり、。
services.AddAuthorizationCore(設定=> {
config.AddPolicy(Policies.IsAdmin、Policies.IsAdminPolicy());
config.AddPolicy(Policies.IsUser、Policies.IsUserPolicy());
});
Index.razor
使用ポリシーの更新AuthorizeView
コンポーネント-魔法の文字列の使用を避けるために。
<AuthorizeViewポリシー= " Policies.IsUser @ " > <P>あなたが唯一見ることができ、これを あればあなたはIsUserポリシーを満たしています。</ p> </ AuthorizeView> <AuthorizeView方針= " Policies.IsAdmin @ " > <P>のことができます。のみを参照して、これを 場合、あなたがIsAdminポリシーを満たしています。</ p> </ AuthorizeView>
最後に、更新プロパティを。FetchData.razor
Authorize
@attribute [承認(ポリシー= Policies.IsAdmin)]
それはそれだ!私たちのアプリケーションは、現在のポリシーベースの認可に転送されます。私たちは今、あなたが上記のいずれかの役割、文、ポリシーまたはカスタムの組み合わせを使用することができ、より柔軟なライセンスシステムを持っています。
サーバーBlazorについて
私は具体的には、サーバーBlazorを議論しなかった理由は非常に簡単で、サーバーBlazorへの私たちの転送に問題なく行うことができます。
概要
この記事では、ASP.NETコアとBlazorポリシーベースの認可を議論します。また、ポリシーベースの認可に対する役割ベースの許可を使用することの利点のいくつかを理解し、我々は、ポリシーベースを検証するための役割ベースの認証からアプリケーションを移行します。
最後にコード(GitHubの)