こんにちはHabrauser! ASP.NET MVCフレームワークに関する私の小さな開発経験をコミュニティと共有したいと思います。 つまり、アプリケーションでのユーザー認証の非常に重要な部分です。 役割ベースのセキュリティシステムの実装と同様に。
この記事は、開発プラットフォームとしてASP.NET MVCを使用する初心者プログラマーに役立つ可能性が最も高いです。 しかし、おそらく「経験のある」(経験のある)ユーザーは、自分でいくつかのアイデアを拾うでしょう。 批判、提案などを歓迎します。 猫に興味がある人は誰でも聞いてください。
したがって、私たちの目標は、小さな役割ベースのセキュリティシステムを使用して、カスタム(カスタム)認証を作成することです。 アプリケーションドメインモデルを変更または追加する必要はありません。 基本的な要件は、ユーザーとロールシステムのヒントです。 メンバーシッププロバイダーに基づく標準のセキュリティシステムは考慮しません。 私にはまったく快適ではないようです。 その主な欠点は、特定のデータスキームが必要なことです。これは、アプリケーションのサブジェクトエリアに関連付けることが難しい場合があります
ちょっとした理論。
小さな理論的な部分から始めましょう。 ASP.NET MVCプラットフォームには、すぐに使用できる認証の種類がいくつかあります。
- Windows認証— 1つの例は、ADツリーに追加されたユーザーです。 すべてのチェックは、特別なプロバイダーを通じて、IISを使用してADによって直接実行されます。 この認証は、エンタープライズアプリケーションによく使用されます。
- パスワード認証(パスワード認証)は、Microsoftが提供する集中認証サービスです。
- フォーム認証-このタイプの認証は、インターネット経由でアクセス可能なアプリケーションに適しており、認証フォームを使用して、指定されたhtmlページへのクライアントリダイレクトを通じて機能します。 クライアントはフォーム上で資格情報を入力し、サーバーに送信します。サーバーでは、資格情報がアプリケーション固有のロジックによって処理されます。 書くのはこのタイプの認証です。
認証では、クライアント側のフォームに暗号化されたCookieが保存されます。 Cookieがサーバーへのリクエストで送信され、ユーザーが承認されたことを示します。 このような暗号化されたセットを作成するには、フォームを介した標準認証で、System.Web.Security.FormAuthenticationクラスのEncriptメソッドを使用します。 デコードには、Decryptメソッドが使用されます。 優れたFormAuthenticationクラスとは何ですか? 彼のエンコードおよびデコード方法は、サーバーマシンキーを使用してデータを暗号化および署名するという事実によって。 これらのキーがないと、Cookieからの情報を読み取ったり変更したりすることができず、車輪を再発明する必要はありません。
プロジェクトの実施
まず、現在のHttpリクエストHttpContext.User.Identityのセキュリティ情報からアクセスできるユーザー認証クラスを作成します。
次に、抽象HTTP認証モジュールを実装します。 ユーザー認証に合格した後に発生するAuthenticateRequestイベントにサブスクライブします。 署名付きメソッドの実装では、ユーザーを作成して現在のHTTPリクエストに書き込むことにより、Cookieを10倍にします。
抽象承認サービスの実装。 認証されたユーザーのデータをCookieに記録します。 HTTPリクエストに追加します。
セキュリティシステムについて忘れないでください。 これを行うには、認証属性を実装します。この属性に、コントローラーメソッドへのアクセスに必要なロールとルールを転送します。 属性はジェネリックをサポートしていないため、別のクラス(RuleFactory)でルールの作成を委任します。
IRuleインターフェースは、認証検査規則を記述します。
実装 public interface IRule { bool Check(IIdentity user); }
プロジェクトで使いやすくするために、基本的な抽象コントローラーを実装します。 現在のユーザーに便利なアクセスを提供します。
使用例
基本的に、特定のプロジェクトの実装全体は、必要なジェネリック型を規定することです。
すべてのプロジェクトで最初に開始することは、識別クラスの実装です。
実装 public class ExampleIdentity : AbstractIdentity<Account, Role> { public string Email { get; set; }
認証モジュールの実装
実装 public class ExampleAutintificateModule : AbstractAutentificationModule<ExampleIdentity, Account, Role> { }
承認モジュールをWeb.configに追加し、そこで認証の種類を変更することは忘れられません。
<?xml version="1.0" encoding="utf-8"?> <configuration> .... <system.web> .... <httpModules> <remove name="FormsAuthentication" /> <add name="FormsAuthentication" type="Example.Infrostructure.ExampleAutintificateModule" /> </httpModules> <authentication mode="Forms"> <forms loginUrl="~/User/Login" timeout="2880" /> </authentication> </system.web> </configuration> <system.webServer> .... <modules runAllManagedModulesForAllRequests="true"> <remove name="FormsAuthentication" /> <add name="FormsAuthentication" type="Example.Infrostructure.ExampleAutintificateModule" /> </modules> </system.webServer>
認可サービスの例。
実装 public class ExampleAuthorizeService : AbstractAuthorizeService<ExampleIdentity, Account, Role> { }
現在のプロジェクトの基本的なコントローラー
実装 public abstract class ExampleController : AbstractController<ExampleIdentity, Account, Role> { }
さて、認証ルールで属性を実装します
おわりに
便宜上、次のコマンドでインストールできるナゲットパッケージライブラリを作成しました。
Install-Package MvcCustomizableFormAuthentication
プロジェクトのあるリポジトリは
githubにあり、動作するアプリケーションの例があります。
お時間をありがとうございました。 アドバイス、批判、提案を楽しみにしています。
PSユニットテストについて忘れられない。