2012-11-03 5 views
3

WebMatrix 코드에서이 두 기능에 도움이되는 기능과 스키마 세트가있는 것으로 보입니다. 그러나 컨트롤러 메소드 나 뷰가 없으므로 직접 구현해야합니다.패스워드 분실 + 이메일 ASP.NET 확인 MVC WebMatrix

어디에도이 코드를 앱에 복사 할 수있는 샘플이 있습니까? 나는 뭔가를 찾고 있어요 :

  • 하는 비밀번호 분실 이메일
  • 가 다시 보내기 확인 이메일보기 + 컨트롤러 방법은

답변

15

잊으 셨나요

  • 암호보기 + 컨트롤러 방법을 잊어 버렸 확인 이메일을 생성 생성 비밀번호 기능

    다른 날에 "비밀번호 분실"을 만들려고했습니다. 기능 "asp.net에서 MVC 4. 나는 봤어요 및 밖으로 있지만 최고의 솔루션을 얻을 수 없습니다. 나는 마침내 탈출구를 발견했다. 15 간단한 단계

    1 부 비밀번호

    1 단계 •이 MVC 4 C# 인터넷 응용 프로그램 템플릿 : (계정 및 홈 자동으로 생성됩니다 컨트롤러) • 빌드 및 실행을 만들고 이메일을 통해 정보를 다시 보내기 귀하의 프로젝트. 등록하고 로그인하십시오. 아차 •

         Everything working fine? 
    

    2 단계 에게 (간단한 회원 테이블이 생성됩니다)! 등록 중에는 이메일 주소를 묻지 않습니다! 사용자에게 비밀번호 토큰을 보내려면 이메일 ID가 필요합니다 !! 이제 데이터베이스에서 몇 가지 변경 사항을 서버 탐색기로 이동해 봅시다! (u를 찾을 수없는 경우 Ctrl + Alt + S를 누를 수 있음) • "데이터 연결"을 확장하면 u가 두 개의 테이블을 보게됩니다. 사용자 프로필 테이블을 엽니 다. 에는 다음과 같은 열이 추가

    1. EMAILID의 NVARCHAR (최대) 2.Details NVARCHAR (최대)

    3 단계 을 이제 솔루션 탐색기로 이동 • ... 모델 ... 계정 모델을. .. 이제 솔루션 탐색기 ...보기 ... A를 이동 • 4 단계

    //new properties 
        [Required] 
        [Display(Name="Email ID")] 
        public string EmailId { get; set; } 
    
        [Required] 
        [Display(Name = "About Yourself")] 
        public string Details { get; set; } 
    

    이메일 아이디 및 세부

    이러한 두 가지 속성을 추가 • 모델 등록 ccount보기 ... Register.cshtml보기 • 사용자가 전자 메일 아이디 및 기타 세부 정보를 입력 할 수 있도록이 두 속성을 추가합니다.

  • @ Html.LabelFor (m => m.EmailId) @ Html.TextBoxFor (m => m.EmailId)
  • @ Html.LabelFor (m => m.Details) @ Html.TextBoxFor (m => m.Details) 5 이제 • 솔루션 탐색기로 이동
  • 단계 ... 컨트롤러 ... 계정 컨트롤러 ...등록 컨트롤러 동작 방법 게시 버전 • 사용자가 전자 메일 아이디 및 기타 세부 정보를 입력 할 수 있도록 이러한 등록 정보를 추가합니다. 변경 내용이 강조 표시됩니다.

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
        if (ModelState.IsValid) 
        { 
         // Attempt to register the user 
         try 
         { 
          WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { EmailId = model.EmailId, Details = model.Details}); 
    
          WebSecurity.Login(model.UserName, model.Password); 
          return RedirectToAction("Index", "Home"); 
         } 
         catch (MembershipCreateUserException e) 
         { 
          ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
         } 
        } 
    
        // If we got this far, something failed, redisplay form 
        return View(model); 
    } 
    

    다시 프로젝트를 빌드하고 실행하지 않는 이유는 무엇입니까? 등록하고 세부 정보를 입력하십시오. 이제 이메일 주소를 지정하라는 메시지가 나타납니다. 사용자가 이메일 ID 및 기타 세부 정보를 입력 할 수 있도록하기 위해이 등록 정보를 추가하십시오.

    서버 탐색기로 이동하여 사용자 프로필 테이블을 마우스 오른쪽 단추로 클릭 한 다음 "테이블 데이터 표시"를 선택하면 확인을 위해 입력 한 세부 정보를 볼 수 있습니다. 이제 •

    6 단계 는 GET 컨트롤러 액션 •

    [AllowAnonymous] 
    public ActionResult ForgotPassword() 
    { 
        return View(); 
    } 
    
    • (POST) 
    
    
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult ForgotPassword(string UserName) 
    { 
        //check user existance 
        var user = Membership.GetUser(UserName); 
        if (user == null) 
        { 
         TempData["Message"] = "User Not exist."; 
        } 
        else 
        { 
         //generate password token 
         var token = WebSecurity.GeneratePasswordResetToken(UserName); 
         //create url with above token 
         var resetLink = "<a href='" + Url.Action("ResetPassword", "Account", new { un = UserName, rt = token }, "http") + "'>Reset Password</a>"; 
         //get user emailid 
         UsersContext db = new UsersContext(); 
         var emailid = (from i in db.UserProfiles 
             where i.UserName == UserName 
             select i.EmailId).FirstOrDefault(); 
         //send mail 
         string subject = "Password Reset Token"; 
         string body = "<b>Please find the Password Reset Token</b><br/>" + resetLink; //edit it 
         try 
         { 
          SendEMail(emailid, subject, body); 
          TempData["Message"] = "Mail Sent."; 
         } 
         catch (Exception ex) 
         { 
          TempData["Message"] = "Error occured while sending email." + ex.Message; 
         } 
         //only for testing 
         TempData["Message"] = resetLink; 
        } 
    
        return View(); 
    } 
    

    단지 뷰를 돌려줍니다 (GET) 컨트롤러 계정 다음과 같은 컨트롤러 액션 메소드를 만들 수있는 이동  암호 재설정 기능을 구현할 수 있습니다. • POST 컨트롤러 동작 : 사용자 이름 수신 해당 존재 여부 확인 암호 재설정 토큰 생성 전자 메일로 보낼 URL을 작성합니다.

    7 단계 비밀번호 분실 액션 메소드에 오른쪽 클릭 • 사용자에 입력 할 수있는 텍스트 상자가 표시됩니다 뷰 페이지 • 아래

    @{ 
        ViewBag.Title = "Forgot Password"; 
    } 
    
    <h2>Forgot Password</h2> 
    
    
    
    @using (Html.BeginForm()) 
    { 
        @Html.AntiForgeryToken() 
        <fieldset> 
         <legend>Forgot Password Form</legend> 
         <ol> 
          <li> 
           @Html.Label("User Name", new { @for = "UserName" }) 
           @Html.TextBox("UserName") 
           <span style="color:red;">@TempData["Message"]</span> 
          </li> 
         </ol> 
         <input type="submit" value="Recover" /> 
        </fieldset> 
    } 
    

    될 것 뷰 페이지의 코드 보기를 추가 사용자 이름

    8 단계 • 솔루션 탐색기로 이동 ... 모델 ... 계정 모델 ... 사용자 프로필보기 모델. 변경 ... 이제 솔루션 탐색기로 이동 •

    [Table("UserProfile")] 
    public class UserProfile 
    { 
        [Key] 
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
        public int UserId { get; set; } 
        public string UserName { get; set; } 
        //new properties 
        public string EmailId { get; set; } 
        public string Details { get; set; } 
    } 
    

    9 단계 강조되어보기 ... 계정 ... 로그인보기. 이제 암호를 잊어 버린 경우를 대비하여 암호를 복구 할 수있는 옵션이 나타납니다.

    <ul>  
          <li> 
            @Html.ActionLink("Register", "Register") if you don't have an account. 
          </li> 
          <li> 
            @Html.ActionLink("Forgot Password", "ForgotPassword") if you want to recover your password. 
          </li> 
         </ul> 
    

    2 부 비밀번호 URL에서 정보를 다시 받기

    1 가 • 솔루션 탐색기 ... 컨트롤러 ... 계정 컨트롤러 ... 로 이동 단계이 방법은 • 새로운 암호 재설정 작업 방법 만들기 URL에서 'un'(사용자 이름) 및 'rt'(비밀번호 재설정 토큰)를 수락합니다. 비밀번호 재설정 액션 메소드에 오른쪽 클릭 •

    [AllowAnonymous] 
    public ActionResult ResetPassword(string un, string rt) 
    { 
        UsersContext db = new UsersContext(); 
        //TODO: Check the un and rt matching and then perform following 
        //get userid of received username 
        var userid = (from i in db.UserProfiles 
            where i.UserName == un 
            select i.UserId).FirstOrDefault(); 
        //check userid and token matches 
        bool any = (from j in db.webpages_Memberships 
           where (j.UserId == userid) 
           && (j.PasswordVerificationToken == rt) 
           //&& (j.PasswordVerificationTokenExpirationDate < DateTime.Now) 
           select j).Any(); 
    
        if (any == true) 
        { 
         //generate random password 
         string newpassword = GenerateRandomPassword(6); 
         //reset password 
         bool response = WebSecurity.ResetPassword(rt, newpassword); 
         if (response == true) 
         { 
          //get user emailid to send password 
          var emailid = (from i in db.UserProfiles 
              where i.UserName == un 
              select i.EmailId).FirstOrDefault(); 
          //send email 
          string subject = "New Password"; 
          string body = "<b>Please find the New Password</b><br/>" + newpassword; //edit it 
          try 
          { 
           SendEMail(emailid, subject, body); 
           TempData["Message"] = "Mail Sent."; 
          } 
          catch (Exception ex) 
          { 
           TempData["Message"] = "Error occured while sending email." + ex.Message; 
          } 
    
          //display message 
          TempData["Message"] = "Success! Check email we sent. Your New Password Is " + newpassword; 
         } 
         else 
         { 
          TempData["Message"] = "Hey, avoid random request on this page."; 
         } 
        } 
        else 
        { 
         TempData["Message"] = "Username and token not maching."; 
        }   
    
        return View(); 
    } 
    

    2 단계 • 솔루션 탐색기로 이동과 같은 단계

    @{ 
        ViewBag.Title = "ResetPassword"; 
    } 
    
    <h2>Password Mailed :) </h2> 
    

    아래에있을 것 뷰 페이지의 코드 보기를 추가 .. . 모델 ... 계정 모델 ... 다음과 같이 변경하십시오. • 우리는 UserProfile DB Model의 인스턴스를 만들고 db.webpages_Memberships '를 DbSet으로 구현합니다.'webpages_Memberships '를 모델로 사용합니다.

    public class UsersContext : DbContext 
        { 
         public UsersContext() 
          : base("DefaultConnection") 
         { 
         } 
    
         public DbSet<UserProfile> UserProfiles { get; set; } 
         public DbSet<webpages_Membership> webpages_Memberships { get; set; } 
        } 
    
        [Table("webpages_Membership")] 
        public class webpages_Membership 
        { 
         [Key] 
         public int UserId { get; set; } 
         public DateTime CreateDate { get; set; } 
         public string ConfirmationToken { get; set; } 
         public bool IsConfirmed { get; set; } 
         public DateTime LastPasswordFailureDate { get; set; } 
         public int PasswordFailuresSinceLastSuccess { get; set; } 
         public string Password { get; set; } 
         public DateTime PasswordChangeDate { get; set; } 
         public string PasswordSalt { get; set; } 
         public string PasswordVerificationToken { get; set; } 
         public DateTime PasswordVerificationTokenExpirationDate { get; set; } 
        } 
    

    4 단계 • 사용자에 대한 임의의 암호를 생성합니다 불리는이 방법 • 계정 컨트롤러 에 임의의 암호 생성 기능을 추가

    private string GenerateRandomPassword(int length) 
        { 
         string allowedChars = "[email protected]$?_-*&#+"; 
         char[] chars = new char[length]; 
         Random rd = new Random(); 
         for (int i = 0; i < length; i++) 
         { 
          chars[i] = allowedChars[rd.Next(0, allowedChars.Length)]; 
         } 
         return new string(chars); 
        } 
    

    5 단계 • 전자 메일 보내기 추가 계정 컨트롤러의 기능. •이 기능은 사용자가 암호를 분실했을 때 복구 단추를 클릭 할 때 사용자에게 첫 번째 메일을 보냅니다. 첫 번째 메일에는 재설정 된 비밀번호 링크가 있습니다. 사용자가 링크를 클릭하면 사용자가 비밀번호 재설정 페이지로 리디렉션됩니다. 다시 새 암호가 사용자에게 우편으로 발송됩니다. • [email protected] 대신 전자 메일 주소를 입력하고 암호를 작성해야합니다.

    private void SendEMail(string emailid, string subject, string body) 
         { 
          System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(); 
          client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 
          client.EnableSsl = true; 
          client.Host = "smtp.gmail.com"; 
          client.Port = 587; 
    
    
          System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("[email protected]", "password"); 
          client.UseDefaultCredentials = false; 
          client.Credentials = credentials; 
    
          System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); 
          msg.From = new MailAddress("[email protected]"); 
          msg.To.Add(new MailAddress(emailid)); 
    
          msg.Subject = subject; 
          msg.IsBodyHtml = true; 
          msg.Body = body; 
    
          client.Send(msg); 
         } 
    
    +2

    +1 대답의 전단 길이. –