我正在使用 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/