2013-02-21 10 views
6

Po prostu chciałem poprosić o pomoc, aby mój scenariusz zadziałał? Chcę uzyskać UserName za pomocą PasswordResetToken.WebMatrix.WebData.WebSecurity - jak uzyskać UserName tylko po PasswordResetToken

Oto mój scenariusz.

  1. Mam na stronie internetowej zapomnianą funkcję hasła, która wysłałaby hasło, które jest skonfigurowane, do zmiany hasła użytkownika.
  2. Chciałem wysłać tylko ciąg hasłoresettoken.
  3. Gdy użytkownik kliknie łącze. Po prostu przetestuję żądanie ["token"], aby uzyskać nazwę użytkownika, a następnie umożliwi użytkownikowi zmianę hasła i autologin.

    to jest mój kod poniżej:

    public ActionResult ChangePassword() 
    { 
        ChangePasswordModel model = new ChangePasswordModel(); 
        string token=string.Empty; 
        try 
        { 
         token = Request["token"].ToString(); 
         int userId = WebSecurity.GetUserIdFromPasswordResetToken(token); 
    
         if (userId > 0) 
         { 
          //Get the user object by (userid) 
          //??????????????????? 
          //??????????????????? 
         } 
         else 
         { 
          throw new Exception("The change password token has expired. Please go to login page and click forgot password again."); 
         } 
        } 
        catch 
        { 
         model.HasError = true; 
         ModelState.AddModelError("", "The change password token has expired. Please go to login page and click forgot password again."); 
        } 
    
        return View(model); 
    } 
    

Z góry dziękuję.

Odpowiedz

9

Spójrz na uwagę na końcu tego artykułu: WebSecurity.GeneratePasswordResetToken Method.

będę skopiuj odpowiednią część dla wygody:

Jeśli użytkownik zapomniał hasła, mogą zażądać nowego. Aby dostarczyć nowe hasło, wykonaj następujące czynności:

  1. Tworzenie strony resetowania hasła, które ma pole, w którym użytkownik może wpisać swój adres e-mail.
  2. Gdy użytkownik wprowadził swój adres e-mail na stronie resetowania hasła, sprawdź, czy ten adres e-mail reprezentuje prawidłowego użytkownika . Jeśli tak, wygeneruj token resetowania hasła, wywołując metodę GeneratePasswordResetToken (String, Int32).
  3. Utwórz hiperłącze wskazujące stronę potwierdzenia w witrynie i zawierające token jako parametr ciągu zapytania w adresie URL linku łącza.
  4. Wyślij łącze do użytkownika w wiadomości e-mail. Gdy użytkownik odbierze wiadomość e-mail, może kliknąć łącze, aby wywołać stronę potwierdzenia o numerze .
  5. Utwórz stronę z potwierdzeniem, która pobiera token z parametru URL i umożliwia użytkownikowi wprowadzenie nowego hasła.
  6. Gdy użytkownik prześle nowe hasło, należy wywołać metodę ResetPassword (String, String) i podać token resetowania hasła i nowe hasło. Jeśli token jest ważny, hasło zostanie zresetowane . Jeśli token jest nieprawidłowy (na przykład wygasł), wyświetla komunikat o błędzie.

Podświetlanie jest moje. Zasadniczo nie potrzebujesz nazwy użytkownika. Ramy wykonują dla ciebie wszystkie ciężkie ćwiczenia.

W odpowiedzi na Twój komentarz nie polecałbym automatycznego logowania użytkownika. Dobrą praktyką jest, aby logował się ręcznie, aby sprawdzić, czy ta zmiana hasła rzeczywiście zadziałała, i nie odkrył, że nie tylko następnym razem .

Zresztą, można to zrobić:

SimpleMembershipProvider provider = (SimpleMembershipProvider)Membership.Provider; 
string username = provider.GetUserNameFromId(userId); 

referencyjny: GetUserNameFromId.

+0

Witaj, dziękuję za odpowiedź. ale chciałem, aby użytkownik był zalogowany po zmianie hasła. –

+0

@NETExperts: Edytowałem odpowiedź, aby odpowiedzieć na Twój komentarz. –

+0

świetnie! sprawdzi to. dzięki. –

1

Myślę, że metoda WebSecurity.GetUserIdFromPasswordResetToken(string token) rób to, co chcesz.

Więcej informacji here.

Aktualizacja:

Niestety, ale nie widział, że już przy użyciu tej metody ... Więc jeśli chcesz uzyskać nazwę użytkownika i używasz kod najpierw migracje Entity Framework, można uzyskać nazwa użytkownika z następującym wyrażeniem LINQ:

string username = yourDbContext.UserProfiles.FirstOrDefault(up=>up.UserId == userId).Username; 
+0

ok, spróbuję. dzięki –

Powiązane problemy