2012-03-28 4 views
1

Ich arbeite an einer Funktion zum Zurücksetzen des Kennworts und versuche zu überprüfen, ob das neue Kennwort mindestens 7 Zeichen lang ist. Es wird laufen und das neue Passwort an den Controller übergeben und es als Passwort für den Benutzer festlegen, aber es verwendet nur das, was eingegeben wurde, anstatt zu überprüfen, ob es die Passwortanforderungen erfüllt. Vielen Dank für alle Anregungen :)Wie kann ich überprüfen, ob ein neues Passwort eine festgelegte Länge mit C# hat?

Hier ist das Modell:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.ComponentModel.DataAnnotations; 

namespace [CompanyName].Models 
{ 
    public class ResetPasswordModel 
    { 
     [Required] 
     [ValidatePasswordLength(7, ErrorMessage = "New passwords must be a minimum of 7 characters, please try a different password.")] 
     [DataType(DataType.Password)] 
     [Display(Name = "New password")] 
     public string NewPassword { get; set; } 

     [DataType(DataType.Password)] 
     [Display(Name = "Confirm new password")] 
     [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 
     public string ConfirmPassword { get; set; } 
    } 
} 

Und hier ist die Seite, um das Passwort zurücksetzen:

@model [CompanyName].Models.ResetPasswordModel 
@{ 
    ViewBag.Title = "ResetPassword"; 
} 

@if (Model == null) 
{ 
    <p> 
     We could not find your user account in the database. 
    </p> 
} 
else 
{ 

    <script type="text/javascript" src="../../Scripts/jquery.infieldlabel.min.js" ></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $("label").inFieldLabels(); 
     }); 
    </script> 
    <h2> 
     Reset Password</h2> 
    <p> 
    Please enter your new password below. 
    </p> 
    <p> 
     Note: New passwords are required to be a minimum of 7 characters in length. 
    </p> 

    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

    using (Html.BeginForm()) 
    { 
    <div style="position: relative;"> 
     <fieldset> 
      <legend>Reset Password</legend> 
     <label for="NewPassword" style="position:absolute; top: 24px; left: 16px;">New Password</label> 



      <div class="editor-field"> 
       @Html.PasswordFor(m => m.NewPassword) 
       @Html.ValidationMessageFor(m => m.NewPassword) 
      </div> 
      <br /> 
     <label for="ConfirmPassword" style="position:absolute; top: 64px; left: 16px;">Confirm New Password</label>  


      <div class="editor-field"> 
       @Html.PasswordFor(m => m.ConfirmPassword) 
       @Html.ValidationMessageFor(m => m.ConfirmPassword) 
      </div> 
      <p> 
       <input type="submit" value="reset Password" /> 
      </p> 

     </fieldset> 

    </div> 
    } 
} 

Aktualisiert Modellcode:

[Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "New password")] 
     [StringLength(50, MinimumLength = 7, ErrorMessage="New passwords must be a minimum of 7 characters, please try a different password.")] 
     public string NewPassword { get; set; } 

     [DataType(DataType.Password)] 
     [Display(Name = "Confirm new password")] 
     [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 
     public string ConfirmPassword { get; set; } 

Controller-Code :

public ActionResult ResetPassword(Guid secureID) 
     { 
      int id = secureID.FromSecureID(); 
      var model = new ResetPasswordModel(); 

      return View(model); 
     } 

     [HttpPost] 
     public ActionResult ResetPassword(Guid secureID, ResetPasswordModel model) 
     { 

      if (ModelState.IsValid) 
      { 
       int id = secureID.FromSecureID(); 
       var user = Database.Users.FirstOrDefault(u => u.ID == id); 
       if (user == null) 
       { 
        ModelState.AddModelError("ID", "Sorry! We could not find your user name in the database, please try again."); 
        return View(model); 
       } 
       //else (model.NewPassword == null) { 
       //return View(); 
       //} 
       user.PasswordHash = model.NewPassword.ToSha1Hash(); 
       Database.SubmitChanges(); 

      } 
      return RedirectToAction("ChangePasswordSuccess"); 
     } 

Aktualisiert Controller-Code:

[HttpPost] 
     public ActionResult ResetPassword(Guid secureID, ResetPasswordModel model) 
     { 

      if(ModelState.IsValid) 
       { 
       int id = secureID.FromSecureID(); 
       var user = Database.Users.FirstOrDefault(u => u.ID == id); 
       if (user == null) 
       { 
        ModelState.AddModelError("ID", "Sorry! We could not find your user name in the database, please try again."); 
        return View(model); 
       } 
       //else (model.NewPassword == null) { 
       //return View(); 
       //} 
       user.PasswordHash = model.NewPassword.ToSha1Hash(); 
       Database.SubmitChanges(); 
       return RedirectToAction("ChangePasswordSuccess"); 
      } 

      return View(model); 
     } 

Aktualisiert Modellcode:

namespace [CompanyName].Models 
{ 
    public class ResetPasswordModel 
    { 
     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "New Password")] 
     [StringLength(100, ErrorMessage = "The new must be at least 7 characters long.", MinimumLength = 7)] 
     public string Password { set; get; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Compare("Password")] 
     [Display(Name = "Confirm New Password")] 
     public string ConfirmPassword { set; get; } 
    } 
} 
+1

Sind Sie die Gültigkeit des Modells in der Controller-Aktion Überprüfung vor der Durchführung die Passwortänderungslogik? .. 'if (ModelState.IsValid) ...'? –

+0

Ich dachte, der 'SqlMembershipProvider' hätte Optionen dafür ... erfüllen sie nicht Ihre Anforderungen? –

+0

@Quintin Ja, ich bin. – Blake

Antwort

1

Diese Eigenschaften in Ihrem View-Modell wird sich darum kümmern.

[Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "New Password")] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 7)] 
    public string NewPassword{ set; get; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Compare("Password")] 
    [Display(Name = "Confirm New Password")] 
    public string ConfirmPassword { set; get; } 

und in Ihrer Controller-Aktion, können Sie für die ModelState.IsValid Eigenschaft überprüfen, um zu sehen, ob die Validierung oder nicht

[HttpPost] 
public ActionResult ResetPassword(Guid secureID, ResetPasswordModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     // Validation correct, Lets save the new password and redirect to another action 
    } 
    return View(model); 
} 
fehlgeschlagen
+0

Okay, ich habe das versucht, ich werde den Code in meiner Frage in nur einer Sekunde aktualisieren. Es scheint immer noch nicht zu funktionieren, und der Verweis auf NewPassword im Controller, wo es tatsächlich das neue Passwort in die Datenbank schreibt brach ... – Blake

+0

@Blake ModelState.ISValid Eigenschaft wird als falsch kommen? hast du Haltepunkte benutzt und siehst wo es bricht? – Shyju

+0

Ich würde, aber ich kann es nicht mit Breakpoints debuggen, bis ich die Fehler beheben und es immer noch auf den Verweis auf NewPassword in der Steuerung bricht, wenn ich versuche, es zu debuggen. – Blake

2

Ich bin nicht sicher, was ValidatePasswordLength, aber System.ComponentModel.DataAnnotations.StringLengthAttribute sollte von MVC Bindemittel und Validatoren (und auch behandelt genügen und auf der jQuery.validate Seite auch).

[StringLength(50, MinimumLength = 7)] 
public string NewPassword { get; set; } 

Dann in Ihrem Controller können Sie eine Aktion wie diese haben:

public ActionResult ResetPassword(ResetPasswordViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //do something with the valid model and return 
    } 

    return View(model); 
} 
+0

Ich habe das Modell geändert, wie Sie sagten, aber es tut immer noch nichts, wenn ein Passwort eingegeben wird ... Ich habe meine Frage bearbeitet und hat den neuen Code veröffentlicht. – Blake

+2

Das klingt gut. Hat das in Verbindung mit dem ModelState.IsValid-Check funktioniert? – HackedByChinese

+0

Nein, es funktioniert immer noch nicht, ich werde meine Frage erneut aktualisieren und den Code auch vom Controller hochladen. – Blake

Verwandte Themen