2015-01-02 1 views
1

사용자 계정의 암호를 재설정하는 데 문제가 있습니다. 나는 그것을하기 위해 Microsoft의 방법을 사용하고 있지만, 단지 작동하지 않습니다. 여기에 내가 잘 작동ASP.NET MVC 및 ID - 암호 재설정이 작동하지 않습니다.

var resetPasswordToken = new ResetPasswordToken 
{ 
    Id = Guid.NewGuid().ToString(), 
    Token = UserManager.GeneratePasswordResetToken(user.Id), 
    User = user, 
    ValidFrom = DateTime.Now, 
    ValidTo = DateTime.Now.AddMinutes(ApplicationConstants.SettingsResetPasswordTokensValidTimeInMinutes) 
}; 

_resetPasswordTokensRepository.Insert(resetPasswordToken); 
_resetPasswordTokensRepository.Save(); 

var email = new ResetPasswordEmailModel 
{ 
    ResetPasswordToken = resetPasswordToken, 
    User = user 
}; 

IUserMailer mailer = new UserMailer(); 
mailer.ResetPassword(email).Send(); 

토큰 재설정 비밀번호를 생성하는 데 사용하는 코드가, 나는 데이터베이스에있는 토큰을하고 난 이메일을 통해 사용자에게 보낼 수 있습니다. 그런 다음 사용자가 링크를 클릭해야합니다. 다음은 새 암호를 생성하고 이전 암호를 데이터베이스의 새 암호로 바꾸는 방법입니다.

var resetPasswordToken = _resetPasswordTokensRepository.GetByEmailAndToken(email, code); 
var newPassword = Membership.GeneratePassword(10, 2); 

var result = await UserManager.ResetPasswordAsync(user.Id, resetPasswordToken.Token, newPassword); 
if (result.Succeeded) 
{ 
    _resetPasswordTokensRepository.Remove(resetPasswordToken); 
    _usersRepository.Save(); 

    var model = new NewPasswordEmailModel 
    { 
     User = user, 
     Password = newPassword 
    }; 

    IUserMailer mailer = new UserMailer(); 
    mailer.NewPassword(model).Send(); 
} 

그리고 이것도 작동합니다. 데이터베이스에서 암호를 변경하고 전자 메일을 통해 사용자에게 보냅니다. 문제는 사용자가 새 암호 또는 이전 암호로 로그인 할 수 없다는 것입니다. 여기에 표시하지는 않았지만 토큰과 사용자가 모두 데이터베이스에 있는지 확인합니다.

내가 뭘 잘못하고 있니?

+0

'IsConfirmed' 열이 false로 설정되어 있습니까? – markpsmith

+0

AspNetUser 테이블에서 열 EmailConfirmed가 있지만 항상 false로 설정되었으며 문제가되지 않았습니다 (모든 것이 작동했습니다). 그것은 그것 때문에 작동하지 않을 수도 있습니다? [편집] 나는 그것을 변경하고 여전히 작동하지 않습니다. –

+0

이전에 작동했다면 아마 문제가 아니었을 것입니다. 그것은 내가 그것을 언급 할 것이라고 생각하기 전에 저를 붙잡은 것입니다! – markpsmith

답변

3

이미 문제를 발견 했음에도 불구하고 더 나은 방향을 제시하려고합니다.

  1. 설명하는 내용은 "Microsoft"가 아닙니다. 처음으로 나는 그런 것을 본다. 이 부분이 템플릿입니까? Visual Studio 2013을 열고 개별 계정으로 새 MVC 프로젝트를 만듭니다. 이렇게하면 "Microsoft"방식으로 제공됩니다.

  2. DB에 토큰을 저장합니다. 그럴 필요 없어. 토큰은 링크로 사용자에게 전자 메일로 보내야하며 사용자가 클릭하면 토큰이 전자 메일을 재설정 한 컨트롤러로 전달됩니다.

  3. 사용자의 새 암호를 생성합니다. 그렇게하지 마십시오. 사용자가 자신의 비밀번호를 선택할 수 있습니다. 그리고 당신은 그걸 위해 Membership을 사용합니다 - 나쁜 습관은 Identity와 MembershipProvider를 혼합합니다. MebershipProvider는 매우 침입 적이며 가능한 경우 인계하려고합니다. 아마도 나중에 문제가 생길 수 있습니다.

  4. 사용자에게 암호를 이메일로 보냈습니다. 아주 나쁜 보안 관행. 이메일은 보안 채널이 아닙니다. 사용자가 웹 페이지에서 새 비밀번호를 선택하게하고 비밀번호를 이메일로 전송하지 마십시오.

매우 권장되는 기사는 Troy Hunt about password resetting입니다. 암호로 작업하는 경우 매우 유용 할 것입니다.

+0

1. 예, "Microsoft"가 의미하는 바입니다. 2. 알아요,하지만 데이터베이스에 보관하고 싶습니다. 암호 재설정이 완료되면 데이터베이스에서 제거됩니다. 3 4. 나는 그것에 대해 생각하고 마침내 이메일을 통해 비밀번호를 보내지 않도록 변경했습니다. 이제 사용자는 자신의 암호를 설정할 수 있습니다. 감사합니다 :) –

관련 문제