3

IsApproved 値が FALSE の場合、ユーザーが入力したパスワードがデータベースに保存されているパスワードと一致するかどうかを確認するにはどうすればよいですか?

私がやりたいことは次のとおりです...

  1. ユーザー登録 - 詳細が保存され、IsApproved が false に設定されます
  2. ユーザーは、メンバーシップ確認リンクが記載されたウェルカム メールを受け取ります
  3. ユーザーが電子メールのリンクをクリック - この時点で IsApproved は True に設定されます
  4. ユーザーはログインできるようになりました

上記のすべてで問題ありません。問題はありません。

私が問題を抱えているところは...

ユーザーがログインを試み、IsApproved フラグが FALSE の場合、DB に保存されているパスワードとパスワードを相互参照する必要があります。

アイデアは、パスワードをクロスチェックし、ユーザーが有効な資格情報を入力した場合、ユーザーにメッセージを表示して、メールをクリックしてメンバーシップを有効にすることでした。

しかし、入力したパスワードが一致しても、コードで確認できないため、IsApproved が false に設定されているため、ValidateUser 関数は常に false を返します。

誰かが私を正しい方向に向けることができますか?

また、実際にパスワードを見る必要はないので、パスワードが一致するかどうかを確認するだけで呼び出すことができる封印された関数があっても、それも問題ありません...

以下は私のコードブロックです..

        Public Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef PwdMatches As Boolean, ByRef Approved As Boolean) As Boolean Implements IMembershipService.ValidateUser
    '
    Dim ThisMember As MembershipUser = Nothing
    Dim ThisResult As Boolean = Nothing
        '
        Approved = False
        ThisResult = False
        PwdMatches = False
        If String.IsNullOrEmpty(Username) Then
            Throw New ArgumentException("Value cannot be null or empty.", "Username")
        ElseIf String.IsNullOrEmpty(Password) Then
            Throw New ArgumentException("Value cannot be null or empty.", "Password")
        ElseIf _Provider.ValidateUser(Username, Password) Then
            ThisResult = True
        Else
            Try
                ThisMember = _Provider.GetUser(Username, False)
                Try
                    If (ThisMember Is Nothing) = False Then
                        Approved = ThisMember.IsApproved
                        Try
                          <!-- This is the point im stuck on -->
                            If Password_Matches_With_Password_In_Db Then
                                PwdMatches = True
                            Else
                                PwdMatches = False
                            End If
                        Catch ex As Exception
                            ThisResult = False
                        End Try
                    Else
                        ThisResult = False
                    End If
                Catch ex As Exception
                    ThisResult = False
                End Try
            Catch ex As Exception
                ThisResult = False
            End Try
        End If
        Return ThisResult
        ThisMember = Nothing
        ThisResult = Nothing
    End Function
4

3 に答える 3

0

メソッドを呼び出してパラメーターとしてMembership GetPassword渡すことができるはずです。これにより、パスワードが返されます。NothingpasswordAnswer

ただし、このアプローチに関する免責事項: 私たちは独自のメンバーシップ プロバイダーと SQL を実装しており、これを検証するための元のコードを持っていないため、デフォルト プロバイダーにこのアプローチを妨げるものがあるかもしれませんが、試してみる価値があります。

編集:

パスワードがハッシュ化されている場合、この問題を解決するには、users テーブルに対して直接データベース クエリを実行して、IsApproved フラグの状態を取得します。これは、エンド ユーザーをどれだけ信頼しているかに応じて、GetUser の呼び出しの前または後に行うことができます (エンド ユーザーを信頼していない場合は、誰かが複数のユーザーがアクティブなユーザーを確認しようとするのを防ぐために、後で呼び出します)。 )。

于 2013-01-02T17:42:49.423 に答える
0
  • 承認待ちのユーザー アカウントを格納するテーブルを作成する方法の 1 つだと思います。ユーザー登録時に、このテーブルに userID または userName を入力するか、アカウントがアクティブ化されておらず、メールが送信されたユーザーを示すいくつかのフラグを設定します。ユーザーがログインするときにこの表を確認してください。存在するか、フラグが設定されていない場合は、「ユーザーにアカウントをアクティブ化してください」と表示されます

  • DB に接続する関数を作成し、userId を使用してAspnet_Membershipテーブルから承認ステータスを取得します。列名はIsApprovedtrue または false です

    Dim user As MembershipUser = Membership.GetUser(userName); Dim isApproved As Boolean = myMethodCheckIfUserIsApproved(user.ProviderUserKey); //userID

于 2013-01-02T17:51:29.483 に答える
0

更新と私の質問への回答

私の質問に答えてくれた皆さん、こんにちは。助けてくれてありがとう。アカウント メンバーシップが承認されたかどうかを確認する前にパスワードを検証しようとして、間違ったツリーを鳴らしていたようです。

私は実際に非常に簡単な方法で問題を解決しました。これは私が行った方法であり、データベースのパスワード フィールドを直接調べる必要も、パスワードのハッシュについて心配する必要もありませんでした。

まず、デフォルトの VALIDATELUSER 呼び出し宣言を変更しました.... からの ACCOUNTS MODEL の SERVICES 領域で...

Function ValidateUser(ByVal Username As String, ByVal Password As String) As Boolean

に...

Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef IsApproved As Boolean) As Boolean

これにより、新しく変更した検証プロセスをアカウント モデルの SERVICES 領域でも呼び出すことができ、元のコードは次のようになりました...

Public Function ValidateUser(ByVal userName As String, ByVal password As String) As Boolean Implements IMembershipService.ValidateUser
  If String.IsNullOrEmpty(userName) Then Throw New ArgumentException("Value cannot be null or empty.", "userName")
  If String.IsNullOrEmpty(password) Then Throw New ArgumentException("Value cannot be null or empty.", "password")
  Return _provider.ValidateUser(userName, password)
End Function

そして、次のようになったMODIFIED関数...

Public Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef Approved As Boolean) As Boolean Implements IMembershipService.ValidateUser
  Dim ThisMember As MembershipUser = Nothing
  Dim ThisResult As Boolean = Nothing
  '
    Approved = False
    ThisResult = False
    If String.IsNullOrEmpty(Username) Then
      Throw New ArgumentException("Value cannot be null or empty.", "Username")
    ElseIf String.IsNullOrEmpty(Password) Then
      Throw New ArgumentException("Value cannot be null or empty.", "Password")
    ElseIf _Provider.ValidateUser(Username, Password) Then
      ThisResult = True
    Else
      ThisMember = _Provider.GetUser(Username, False)
      If (ThisMember Is Nothing) = False Then
        Approved = ThisMember.IsApproved
      End If
    End If
    Return ThisResult
    ThisMember = Nothing
    ThisResult = Nothing
  End Function

DB を直接操作したり、パスワードをハッシュしたりするよりも、この手順の方がはるかに満足しています。

つまり、実際には、処理の元のシーケンスが後ろから前にあるということでした.... IE. (1)ログイン資格情報を検証してから、(2)電子メールが確認されたかどうかを確認しませんか? (ウェルカム メッセージのリンク経由) ではなく... (1)電子メールが確認された後、(2)ログイン資格情報が検証される

于 2013-01-05T03:49:04.830 に答える