как установить web.config и использовать метод ASP.NET ResetPassword () - PullRequest
2 голосов
/ 28 августа 2011

Я использую проверку подлинности с помощью форм 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="donot.reply@gmail.com">
        <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(), которая должна получить параметр, либо портит другой код на странице, которая получает учетную запись пользователя для других манипуляций.

Решение здесь портит другие MembershipUser user = Membership.GetUser(username); строки в моем коде.

Так где и как мне настроить мой web.config, если я хочу следующее:
1. Пользователь может сбросить свой пароль для себя, используя вопросы и ответы по безопасности (это уже работает)
2. Администратор может сбросить пароль для пользователя. Пользователь получит E-Mail с новым паролем.

Заранее спасибо,
Summerbulb

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

У вас есть пользовательские настройки членства?Я не вижу их в конфиге.У меня тоже была такая же проблема, и я бросил вопрос / ответ по паролю.Вы хэшируете пароли и парольные ответы?При использовании опции хеширования это не сработает без знания правильного ответа.Если вы выполняете зашифрованный маршрут, то вы можете рефлексивно вызывать методы Decrypt в классе SqlMembershipProvider для дешифрования данных, что немного сложно, но работает.

Аналогично, у вас есть несколько других вариантов.Отключите пароль вопрос / ответ, но сделайте это самостоятельно.Структура членства не была предназначена для функций системного администратора.Во-вторых, сохраните ответ вручную (по сути, продублируйте его) в виде открытого текста или зашифруйте с использованием вашего алгоритма и расшифруйте его.

Вопрос о пароле и его ответ задаются в конфигурации, поэтому, наконец, вы можете также сделать двапровайдеры членства, второй с требованием запроса и ответом на ложь:

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

На вашем экране администратора выполните:

Membership.Providers[1].ResetPassword();

И тогда это работает, потому что его состояние конфигурации не задает вопросов и ответовнеобходимо.

Дайте мне знать, если вам нужна дополнительная информация.

1 голос
/ 29 августа 2011

Что вам нужно для части 2 (Администратор может сбросить пароль для пользователя. Пользователь получит E-Mail с новым паролем.) Вы можете увидеть здесь

http://www.ezineasp.net/post/ASP-Net-2-0-Password-Recovery-Control-With-Email.aspx

Для меня это работает.Если пользователь забыл свой пароль, он получает электронное письмо с новым паролем. Только вам нужно установить для enablePasswordReset значение true.

...