【问题标题】:PasswordReset() throws exception - passwordAnswer?PasswordReset() 抛出异常 - passwordAnswer?
【发布时间】:2026-02-02 00:00:01
【问题描述】:

我有一个应用程序,我正在尝试实现以下功能,但似乎无法弄清楚如何:

  1. 用户注册,但系统为他们创建自己的临时密码
  2. 管理员批准用户,作为批准的一部分,用户会收到一个临时用户名/密码。

问题是我无法将 MembershipProvider 设置为启用密码检索,因为这似乎禁用了证书身份验证。我确实启用了密码重置,但是当我尝试在第 2 步中使用它时(尝试创建一个新密码,以便我可以将其以纯文本形式通过电子邮件发送给用户),它会引发错误:

一般错误:System.Web.HttpUnhandledException (0x80004005):引发了“System.Web.HttpUnhandledException”类型的异常。 ---> System.ArgumentNullException:值不能为空。 参数名称:passwordAnswer

有没有办法解决这个问题?

下面是相关代码的一段代码sn-p:

MembershipUser mu = Membership.GetUser(Session["UserId"], false);
string password = mu.ResetPassword(); 

【问题讨论】:

    标签: asp.net asp.net-membership


    【解决方案1】:

    密码为空,因为没有输入任何内容。在您的代码中,只需使用 if:

    if (passwordAnswer==null){
    //do stuff here
    }
    

    虽然你可以在那里写任何东西,但我建议:

    if (passwordAnswer==null){
     passwordAnswer=" ";//just a space
    }
    

    如果您希望它是生成的密码,请研究生成随机字母数字字符串。

    【讨论】:

    • 我刚刚检查过,当我最初创建用户时,passwordAnswer 正在被填写。我正在做 MembershipCreateUser() 并将 passwordAnswer 设置为“0”,但是当我查看数据库时,它是一个长加密字符串,但与密码列不同......
    • 好的,当我向会员提供者添加 requiresQuestionAndAnswer="false" 时,我似乎能够解决这个问题
    【解决方案2】:

    我可以通过在我的 web.config 中向会员提供程序添加 requiresQuestionAndAnswer="false" 来规避这个问题:

    <membership defaultProvider="DefaultMembershipProvider">
    
          <providers>
    
            <add name="DefaultMembershipProvider"
                type="System.Web.Security.SqlMembershipProvider"
                requiresUniqueEmail="true"
                connectionStringName="DB"
                applicationName="Acme"
                maxInvalidPasswordAttempts="3"
                requiresQuestionAndAnswer="false"
                enablePasswordReset="true"
                minRequiredPasswordLength="15"
                minRequiredNonalphanumericCharacters="1"
                passwordAttemptWindow="3"
                passwordFormat="Hashed" />
    
          </providers>
    
        </membership>
    

    【讨论】: