質問

データベース スキーマに適合させるために、現在の ASP .Net プロジェクト用のカスタム メンバーシップ プロバイダーを作成する必要がありましたが、パスワードを 3 回間違えた場合にユーザーをロックアウトするように構成する際に問題が発生しました。標準プロバイダー。

これは自分で実装する必要があるものですか、それとも本質的にサポートされるべきものですか?

これを具体的に処理するコードはありません (そして、どのインターフェース メンバーもこれに具体的に対処していないようです)。しかし、これを自分で実装する必要がある場合、ロックアウトされていることをユーザーにどのように通知すればよいでしょうか?ValidateUser で何らかの例外を発生させる必要がありますか?

解決

残念ながら 2 つの回答にマークを付けることはできません。Dave R が提供するリンクでは、メンバーシップがどのように機能するかについて詳しく説明しています。Zhaph が指摘したことは、カスタム メンバーシップ プロバイダーでロックアウトされたロジックを処理するという、私が最終的に行ったことそのものでした。

次に、ログイン コントロールの LoginError イベントを使用してエラー状態を処理し、適切なエラー メッセージを表示するためにユーザーがロックアウトされているかどうかをチェックインしました。

役に立ちましたか?

解決

Scott Mitchell は、ASP.NET サイトで優れたチュートリアル シリーズを執筆しています。このリンクには、カスタム プロバイダーの作成に関する情報が含まれており、ロック ロジックについて説明しています。

http://www.asp.net/LEARN/security/tutorial-06-cs.aspx

また、アカウントのロックを解除するための組み込みメソッドもありません (つまり、SqlMembershipProvider に似たものを使用している場合は、データベース ツールを使用してこれを行う必要があります)。Scott は、これを管理するための UI の作成に関する記事も書いています。こちらでご覧いただけます。

http://www.asp.net/LEARN/security/tutorial-14-vb.aspx

実はシリーズ全体を読むことをお勧めします。スコットは優れたコミュニケーション能力があります。

これがお役に立てば幸いです。

他のヒント

これは自分で書かなければならないものです。

デフォルトのデータベース スキーマには、aspnet_Membership テーブルに次の列があります。

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

試行回数は試行ウィンドウ内で失敗するたびに増分され、最初に失敗した試行の時刻がウィンドウ開始列に保存されます。FailedPasswordAttemptCount が構成の maxInvalidPasswordAttempts と等しくなると、IsLockedOut が設定されます。

michiel が述べているように、ValidateUser メソッドは、プロバイダー構成の設定に基づいてこれらの値を確認する必要があります。デフォルトでは、これらの値は次のとおりです。

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

ユーザーが最大ログイン試行回数を超えたら、プロバイダーから MembershipUser.IsLockedOut が設定されていることを確認する必要があります。その後、その値を確認して適切に動作できます。デフォルトのログイン コントロールを使用している場合、これは値はおそらくすでにチェックされているでしょう。

ロックアウトにつながる条件 (不正なログイン試行が多すぎる) を再現します。メンバーシップ プロバイダーは毎回バックエンドにアクセスするため、このアプローチを妥当な数の MaxInvalidPasswordAttempts を持つプロバイダーに限定することが賢明です。

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

カスタム メンバーシップ プロバイダーでは、ValidateUser 関数を実装する必要があります。そこでは、ユーザー名とパスワードが有効かどうかを確認するだけでなく、無効なパスワード試行回数などもデータストアから取得します。ユーザー名/パスワードが有効な場合はパスワードの試行回数をリセットし、そうでない場合は試行回数を増やします。SqlMembershipProvider には LastAttempt 日時も格納されるため、特定の時間枠内での試行は許可されていないため、ブルートフォースで侵入することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top