c# - 如何设置 web.config 并使用 ASP.NET ResetPassword() 方法

标签 c# asp.net web-config forms-authentication

我正在使用 asp.net 表单例份验证,并且我需要能够重置用户的密码。

这是代码:

protected void resetPassword(string username)
{
    MembershipUser user = Membership.GetUser(username);
    if (user != null)
    {
        string newPassword = user.ResetPassword();
        Membership.UpdateUser(user);
        MailMessage message = new MailMessage("", user.Email, "change password", "your Password changed to: " + newPassword);
        userManager.sendMail(message);
    }
}

这是我的 web.config 文件:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
  </appSettings>
  <system.webServer>
    <handlers>
      <remove name="ChartImageHandler" />
      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST"
       path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </handlers>
  </system.webServer>
  <connectionStrings>
    <add name="CRM_DBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\CRM\CRM\DAL_new\CRM_DB.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
    <add name="CRM_DBConnectionString2" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\CRM\DAL_new\CRM_DB.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>
    <httpHandlers>
      <add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
       validate="false" />
    </httpHandlers>
    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting"
         assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </controls>
    </pages>
    <roleManager enabled="true"/>
    <authentication mode="Forms">
      <forms loginUrl="./login_page/Default.aspx" name=".ASPXFORMSAUTH" protection="All" timeout="43200" requireSSL="false" slidingExpiration="true" cookieless="UseCookies" enableCrossAppRedirects="false" />
    </authentication>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
  </system.web>
  <system.net>
    <mailSettings>
      <smtp from="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d2922232239633f283d21340d2a202c2421632e2220" rel="noreferrer noopener nofollow">[email protected]</a>">
        <network host="smtp.gmail.com" password="########" port="587" userName="######@gmail.com"/>
      </smtp>
    </mailSettings>
  </system.net>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IBlServer" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
            <message clientCredentialType="UserName" algorithmSuite="Default"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:51109/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBlServer" contract="CrmServiceReference.IBlServer" name="BasicHttpBinding_IBlServer"/>
    </client>
  </system.serviceModel>
</configuration>

行:string newPassword = user.ResetPassword();抛出异常:

System.ArgumentNullException was unhandled by user code
  Message=Value cannot be null.
Parameter name: passwordAnswer

我在这里和其他网站上遇到过很多类似的问题,但我似乎无法正确回答。它要么最终出现有关必须获取参数的 ResetPassword() 的错误,要么弄乱页面上检索用户帐户以进行其他操作的其他代码。

解决方案here搞乱了我的代码中的其他 MembershipUser user = Membership.GetUser(username); 行。

如果我想要以下内容,我应该在哪里以及如何配置我的 web.config:
1. 用户可以使用安全问答为自己重置密码(这已经有效)
2. 管理员可以为用户重置密码。用户将收到一封包含新密码的电子邮件。

提前致谢,
夏季灯泡

最佳答案

您是否提供自定义成员(member)资格设置?我在配置中没有看到它们。我也遇到了同样的问题,最终放弃了密码问题/答案。您是否对密码和密码答案进行哈希处理?如果使用散列选项,则在不知道正确答案的情况下这将不起作用。如果您正在执行加密路由,那么您可以反射性地调用 SqlMembershipProvider 类中的 Decrypt 方法来解密数据,这有点痛苦,但有效。

同样,您还有其他一些选择。关闭密码问题/答案,但可以自行自定义实现。成员资格框架不适用于系统管理功能。其次,以明文形式手动存储答案(本质上是复制它)或使用您的算法加密,然后解密。

密码问题和答案都是由配置驱动的,所以最后,您还可以考虑创建两个成员(member)提供程序,第二个将 requirequestionandanswer 设置为 false:

<add name="AdminProvider" type="<point to SQL membership" requiresQuestionAndAnswer="false" />

在您的管理屏幕中,执行以下操作:

Membership.Providers[1].ResetPassword();

然后它就可以工作了,因为它的配置表明不需要问题和答案。

如果您需要更多信息,请告诉我。

关于c# - 如何设置 web.config 并使用 ASP.NET ResetPassword() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223099/

相关文章:

c# - MVC3 和 URL(使用区域,构建 <a> 标签有问题)

c# - 通过句柄托管 Win32、WinForms 或 WPF 窗口?

jquery - 为什么我的 PostBack 发生在 jQuery 单击事件之前?

asp.net-core - ASP.NET Core Web.Config 发布

c# - ASP.NET Core依赖注入(inject): The Difference Between Factory and Instance?

c# - 我如何管理另一个类抛出的异常

asp.net - 在 ASP.NET 中使用 <%= %> 或 <%# %> 与 runat=server

c# - Asp.net session 终止

c# - ScriptResource.axd 没有加载到 asp.net 中? 500 URL 重写模块错误

java - 如何为 Java Web 服务创建和使用配置文件?