MVC使用ASP.NET Identity 2.0實現使用者身份安全相關功能,比如通過簡訊或郵件發送安全碼,賬戶鎖定等

來源:互聯網
上載者:User

標籤:des   c   style   class   blog   code   

本文體驗在MVC中使用ASP.NET Identity 2.0,體驗與使用者身份安全有關的功能:

 

→install-package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 -Pre

安裝後,在App_Start,Controllers, Models, Views等處都添加了多個檔案。在App_Start/IdentityConfig.cs中有6個類和一個枚舉:

 

● ApplicationUserManager:繼承於泛型基類UserManager<ApplicationUser>, ApplicationUser用來處理使用者的身份。
● ApplicationRoleManager
● EmailService
● SmsService
● ApplicationDbInitializer
● SignInHelper
● SignInStatus 枚舉


□ Two-Factor Authentication機制

在ASP.NET Identity 2.0中,使用了"Two-Factor Authentication機制"來保證使用者密碼的安全,當使用者密碼可能存在不安全隱患的時候,系統會以簡訊或郵件的方式向使用者發送安全碼。

 

在ApplicationUserManager中的Create方法包含了驗證使用者名稱和密碼以及發送安全碼的邏輯:


 

PhoneNumberTokenProvider和EmailTokenProvider都繼承於EmailTokenProvider,這個基類負責向使用者傳送簡訊或email。發送的前提是需要註冊EmailService和SmsService,如下:

 

□ Account Lockout鎖住帳號

當使用者輸錯密碼超過規定的次數,帳號就會被鎖住。

 

在ApplicationUserManager中的Create方法也包含了鎖住帳號的邏輯:

 

→在EmailService中編寫發送右鍵的邏輯:

public class EmailService : IIdentityMessageService    {        public Task SendAsync(IdentityMessage message)        {            // Plug in your email service here to send an email.            //配置            var mailMessage = new System.Net.Mail.MailMessage("[email protected]",                message.Destination,                message.Subject,                message.Body)                        //發送            SmtpClient client = new SmtpClient();            client.SendAsync(mailMessage, null);            return Task.FromResult(0);        }    }

 

→在Web.config中的<configuration>節點下配置內送郵件的檔案夾

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="F:\mailDrop"/>
      </smtp>
    </mailSettings>
  </system.net>   

 

→在Web.config中的<connectionStrings>節點配置連接字串,用來把使用者資訊儲存到資料庫

<add name="DefaultConnection" connectionString=".;Initial Catalog=MVC_Identity-1-14;user id=sa;password=woshiniba;Integrated Security=SSPI" 
providerName="System.Data.SqlClient" />

 

→AccontController中接收[HttpPost]的Register方法包含了使用者註冊後發送確認郵件的邏輯

[HttpPost]        [AllowAnonymous]        [ValidateAntiForgeryToken]        public async Task<ActionResult> Register(RegisterViewModel model)        {            if (ModelState.IsValid)            {                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };                var result = await UserManager.CreateAsync(user, model.Password);                if (result.Succeeded)                {                    var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);                    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);                    await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");                    ViewBag.Link = callbackUrl;                    return View("DisplayEmail");                }                AddErrors(result);            }            // If we got this far, something failed, redisplay form            return View(model);        }

 

→運行項目 測試註冊、確認郵件、登入

點擊右上方的Register連結:

 

填寫註冊資訊,點擊註冊:

 

注意:在Web.config中配置的mailDrop檔案夾,需要建立,否則報錯!

 

找到mailDrop檔案夾,使用Foxmail開啟尾碼為eml的檔案,看到:

 

點選連結地址:

 

點擊"Click here to Log in"並登入:

 

→運行項目 測試賬戶鎖定

修改App_Start/IdentityConfig.cs中, ApplicationUserManager類的相關部分為:

            manager.UserLockoutEnabledByDefault = true;
            manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(1);
            manager.MaxFailedAccessAttemptsBeforeLockout = 2;

 

在App_Start/IdentityConfig.cs中,SignInHelper類的PasswordSignIn修改如下:

public async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)        {            var user = await UserManager.FindByNameAsync(userName);            //為測試帳號鎖住而添加            await UserManager.IsLockedOutAsync(user.Id); //如果使用者被鎖住,這裡返true            await UserManager.AccessFailedAsync(user.Id);//記錄登入失敗的次數,如果登入失敗次數大於或等於設定的次數,在設定鎖住時間內,使用者賬戶被鎖住            await UserManager.SetLockoutEnabledAsync(user.Id, true);//確認使用者賬戶被鎖住是否被啟用            if (user == null)            {                return SignInStatus.Failure;            }            if (await UserManager.IsLockedOutAsync(user.Id))            {                return SignInStatus.LockedOut;            }            if (await UserManager.CheckPasswordAsync(user, password))            {                return await SignInOrTwoFactor(user, isPersistent);            }            if (shouldLockout)            {                // If lockout is requested, increment access failed count which might lock out the user                await UserManager.AccessFailedAsync(user.Id);                if (await UserManager.IsLockedOutAsync(user.Id))                {                    return SignInStatus.LockedOut;                }            }            return SignInStatus.Failure;        }

 

再次登入,試著輸入2次錯誤密碼,出現提示帳號被鎖住的介面:

當然還有一些其它功能,比如密碼重設等。

 

參考資料:
Developing Secure ASP.NET MVC Applications using ASP.NET Identity 2.0

github項目地址

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.