我如何检查以确保新密码的长度与C#一致

本文关键字:密码 一致 确保 何检查 检查 新密码 | 更新日期: 2023-09-27 18:29:24

我正在研究密码重置功能,并试图检查以确保新密码至少为7个字符。它将运行并将新密码传递给控制器,并将其设置为用户的密码,但它只是使用输入的内容,而不是检查以确保其符合密码要求。感谢您的任何建议:)

这是型号:

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; }
    }
}

这是重置密码的页面:

@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>
    }
}

更新型号代码:

[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; }

控制器代码:

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");
        }

更新的控制器代码:

[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); 
        }

更新型号代码:

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; }
    }
}

我如何检查以确保新密码的长度与C#一致

我不确定ValidatePasswordLength是什么,但System.ComponentModel.DataAnnotations.StringLengthAttribute应该足够了,并且由MVC绑定器和验证器处理(也在jQuery.validate端)。

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

然后在你的控制器中,你可以有这样的动作:

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

视图模型中的此属性将处理它。

    [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; }

在控制器操作中,您可以检查ModelState.IsValid属性以查看Validation是否失败

 [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);
 }

您可以使用PasswordValidator。

// Check if the Password has changed
if (!string.IsNullOrEmpty(model.Password))
{
    // Get the first PasswordValidators... it must do
    var pwd = userManager.PasswordValidators[0];
    // Check whether the Password is valid
    result = await pwd.ValidateAsync(userManager, user, model.Password);
    if (!result.Succeeded)
    {
        foreach (var error in result.Errors)
            ModelState.AddModelError("", error.Description);
        return View(model);
    }
    // Hash the new Password
    user.PasswordHash = userManager.PasswordHasher.HashPassword(user, model.Password);
    bDirty = true;
}

您可以从视图中删除这条线。

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 7)]