MembershipProvider和RequiresQuestionAndAnswer

|| 我们提供一个网站模板供客户用作其网站的基础。我们的网站有一个自定义的成员资格提供程序。 我们遇到了一个客户提出的问题。客户通过带有URL的URL的电子邮件向潜在成员发送邀请以登录该成员。在注册过程中,他们设置了安全问题/答案。 但是,有时准会员会丢失电子邮件(并因此丢失密码),但仍会尝试加入该站点。 客户要求允许会员在注册未完成时重设密码,而无需通常的安全性问题/答案。 不幸的是,MembershipProvider在询问是否需要问题/答案时未提供用户名。但是它确实会在之前调用GetUser()。 为了使此功能正常工作,我在MembershipProvider中添加了一种方法(StartingPasswordRecovery),以标记该密码重置处于活动状态,并从PasswordRecovery页面的OnVerifyingUser事件中调用它。 尽管此代码有效,但我不认为它非常强大。 谁能指出我的解决方案。 这是我添加到会员资格提供者中的相关代码。
Private _hasUserDefinedQuestionAndAnswer As Boolean
Private _isResettingPassword As Boolean

Public Overloads Overrides Function GetUser(ByVal username As String, ByVal userIsOnline As Boolean) As System.Web.Security.MembershipUser
    ...
    _hasUserDefinedQuestionAndAnswer = ...
    ... 
End Function

Public Overrides ReadOnly Property RequiresQuestionAndAnswer() As Boolean
    Get
        If Me._isResettingPassword Then
            Me._isResettingPassword = False
            Return Me.pRequiresQuestionAndAnswer And Me._hasUserDefinedQuestionAndAnswer
        End If

        Return Me.pRequiresQuestionAndAnswer
    End Get
End Property

Public Sub StartingPasswordRecovery()
    Me._isResettingPassword = True
End Sub
    
已邀请:
我不确定自己是否正确理解您的语言,但是您是否无法使用用户个人资料来确定用户是否需要提问和回答? web.config:
<profile defaultProvider=\"YourProfileProvider\">
    <providers>
        <clear/>
        <add name=\"YourProfileProvider\" type=\"System.Web.Profile.SqlProfileProvider\"  connectionStringName=\"ConnectionStringToDB\" applicationName=\"/YourApp\"></add>
    </providers>
    <properties>
        <add name=\"RequiresQuestionAndAnswer\" defaultValue=\"false\" />
    </properties>
</profile>
自定义成员资格提供者:
Public Overrides ReadOnly Property RequiresQuestionAndAnswer As Boolean
    Get
        If HttpContext.Current.User.Identity.IsAuthenticated Then
            Dim userRequiresQuestionAndAnswer = _
                CType(HttpContext.Current.Profile.GetPropertyValue(\"RequiresQuestionAndAnswer\"), Boolean)
            Return userRequiresQuestionAndAnswer
        Else
            Return MyBase.RequiresQuestionAndAnswer 
        End If
    End Get
End Property
您可以在用户管理页面中为每个用户分别设置它:
HttpContext.Current.Profile.SetPropertyValue(\"RequiresQuestionAndAnswer\", userRequiresQuestionAndAnswer)
HttpContext.Current.Profile.Save()
编辑: 根据您的评论,我对代码做了一些修改。我希望这有助于使其工作: 在自定义成员资格提供者中:
Public Overloads Overrides ReadOnly Property RequiresQuestionAndAnswer As Boolean
    Get
        If HttpContext.Current.User.Identity.IsAuthenticated Then
            Return RequiresQuestionAndAnswer(Membership.GetUser.UserName)
        Else
            Return MyBase.RequiresQuestionAndAnswer
        End If
    End Get
End Property

Public Overloads ReadOnly Property RequiresQuestionAndAnswer(ByVal userName As String) As Boolean
    Get
        Dim profile As ProfileBase = ProfileBase.Create(userName)
        If Not profile Is Nothing Then
            Dim userRequiresQuestionAndAnswer = _
                CType(profile.GetPropertyValue(\"RequiresQuestionAndAnswer\"), Boolean)
            Return userRequiresQuestionAndAnswer
        Else
            Return MyBase.RequiresQuestionAndAnswer
        End If
    End Get
End Property
您的PasswordRecovery-Control在哪里:
Protected Sub VerifyingUser(ByVal sender As Object, ByVal e As LoginCancelEventArgs)
    Dim login As WebControls.Login = DirectCast(Me.LoginView1.FindControl(\"Login1\"), WebControls.Login)
    Dim userName = DirectCast(login.FindControl(\"PwdRecovery\"), PasswordRecovery).UserName
    Dim RequiresQuestionAndAnswer = DirectCast(Membership.Provider, YourMembershipProvider).RequiresQuestionAndAnswer(userName)
    \'....\'
End Sub
    

要回复问题请先登录注册