2011-08-28 2 views
2

asp.net 폼 인증을 사용하고 있으며 사용자의 비밀번호를 재설정 할 수 있어야합니다. web.config를 설정하고 ASP.NET ResetPassword() 메서드를 사용하는 방법

코드입니다 :

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="[email protected]"> 
     <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> 

라인 : 나는했습니다

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

: string newPassword = user.ResetPassword();는 예외를 throw 비슷한 질문을 여러 곳에서 받았지만 다른 사이트에서는 볼 수 없었습니다. 매개 변수를 가져와야하는 ResetPassword()에 대한 오류로 끝나거나 다른 조작을 위해 사용자 계정을 검색하는 페이지에서 다른 코드를 위로 가져옵니다.

해결책 here 내 코드에 다른 MembershipUser user = Membership.GetUser(username); 행이 있습니다.

어디 방법에 내가 다음 원하는 경우 난 내 Web.config의를 구성 : 보안 Q & (이 이미 작동)
2. 관리자 사용하여 자신을 위해 자신의 비밀번호를 재설정 할 수 있습니다
1. 사용자 사용자의 비밀번호를 재설정 할 수 있습니다. 사용자는 새 암호로 전자 메일을 받게됩니다. 사전에

감사합니다,

답변

2


Summerbulb 당신은 사용자 지정 멤버 자격 설정을 제공하고 있습니까? 내가 설정에서 그들을 볼 수 없습니다. 나도 똑같은 문제를 겪었고 비밀번호 질문/답변을 포기했다. 암호 및 암호 해시를 해싱하고 있습니까? 해시 옵션을 사용하는 경우 정답을 모르면 작동하지 않습니다. 암호화 된 경로를 수행하는 경우 SqlMembershipProvider 클래스의 Decrypt 메서드를 반사 식으로 호출하여 데이터를 해독 할 수 있습니다. 이는 약간의 어려움이 있지만 작동합니다.

마찬가지로 다른 옵션이 있습니다. 비밀번호 질문/답변을 끄고 사용자 정의를 직접 구현하십시오. 멤버쉽 프레임 워크는 sys admin 기능을위한 것이 아닙니다. 둘째, 해답을 수동으로 (본질적으로 복제) 일반 텍스트로 저장하거나 알고리즘을 사용하여 암호화하고 해독하십시오.

암호 질문과 답변이 모든 설정에서 구동되기 때문에, 마지막으로, 당신은 또한 두 멤버 자격 공급자, false로 requiresquestionandanswer와 두 번째 하나로 고려할 수있다 : 당신의 관리자 화면에서

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

을 수행

Membership.Providers[1].ResetPassword(); 

구성 상태이므로 질문 및 대답이 필요합니다.

자세한 정보가 필요하면 알려주세요.

+1

'알고리즘을 사용하여 암호화'절대 해보지 마십시오. 기본 제공 암호화 서비스 –

+0

'을 사용하면 두 개의 멤버 자격 공급자를 만들 수도 있습니다.하지만 첫 번째 멤버는 없습니다. 나는 그것을 필요로 하느냐? 멤버 공급자를 추가해도 해당 코드의 'MembershipUser user = membership.GetUser (username);'에 영향을 미치지 않을까요? – summerbulb

+0

@summerbulb 멤버십 섹션을 정의해야합니다. 그렇지 않으면 'user'변수가 항상 null이됩니다. 그렇지 않으면 GetUser가 이전에 예외를 throw합니다. 짧게 이야기하면 web.config의 멤버십 섹션없이 코드가 작동하지 않습니다. –

1

당신이 2 부에 필요한 무엇 (과 관리자는 사용자의 암호를 재설정 할 수 있습니다. 사용자는 새 암호를 사용하여 전자 메일을 받게됩니다.) 당신이 나를 위해 여기

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

를 볼 수 있습니다 그것은 작동합니다. 사용자가 암호를 잊어 버린 경우 새 암호로 전자 메일을받습니다.enablePasswordReset을 true로 설정해야합니다.

+0

'enablePasswordReset을 true로 설정해야합니다.' - 어디서 어떻게? 내가 게시 한 링크의 설정 섹션이 어떻게 든 자동 생성되었다고 확신합니다. – summerbulb

+0

필자는 web.config에 "enablePasswordReset = true"라는 줄을 추가했으며 사용자가 암호를 잊어 버린 경우 암호 복구 후에 새 암호를 가져오고 resetPassword() 함수를 작성할 필요가 없습니다. – Rougher

+0

<이름 = "AspNetSqlMembershipProvider에"의 connectionStringName = "LocalSqlServer"를 추가 applicationName을 = "/" 유형 = "System.Web.Security.SqlMembershipProvider, System.Web, 버전 = 2.0.0.0, 중립 문화 = PublicKeyToken = b03f5f7f11d50a3a " enablePasswordRetrieval ="true "를 enablePasswordReset ="false "를 passwordFormat ="지우기 "/> Rougher

관련 문제