Owin+ASP.NET Identity淺析系列(一)用戶登錄注冊


在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《Owin+ASP.NET Identity淺析系列》來祭奠那逝去的……

  使用VS2015創建MVC項目運行之后,發現微軟很貼心的生成了一套用戶授權驗證系統,界面也很漂亮,但是扒拉代碼一看,囧……新的membership框架,真是太給力了,連數據庫表都給你生成了(EF的功勞),問題是,你這一堆一堆的代碼,雖然看着很吊(也

確實很吊),但是看着人頭大呢,只好研究研究,研究過程記錄一下,希望可以幫到那些看到這堆代碼之后也頭皮發麻的小伙伴們!!!

第一步:刪除這一堆代碼

  微軟折騰了一堆代碼,說實話對微軟的各種viewmodel驗證不感冒,所以我要刪除它,重新來過!喜歡使用的童鞋,可以保留

  備注:親,別全部刪完,請保留IdentityModels類,修改下命名空間,並將其移入App_Start目錄中

  

第二步:拉出自動生成數據表的sql語句(因為后面使用的是mysql數據庫,而且引擎還不是innodb)

create table aspnetusers
(
	Id char(32) primary key,
	Email varchar(50) null comment '用戶郵箱',
	EmailConfirmed bit not null comment '是否認證郵箱',
	PasswordHash varchar(100) null comment '賬戶密碼',
	SecurityStamp varchar(100) null comment '防偽印章',
	PhoneNumber varchar(100) null comment '用戶手機',
	PhoneNumberConfirmed bit not null comment '是否認證手機',
	TwoFactorEnabled bit not null comment '是否啟用雙重身份驗證',
	LockoutEndDateUtc datetime null comment '鎖定結束時間',
	LockoutEnabled bit not null comment '是否啟用鎖定',
	AccessFailedCount int not null comment '登陸失敗次數',
	UserName varchar(50) not null comment '用戶名稱'
) comment '用戶表';

create table aspnetuserclaims
(
	Id int auto_increment primary key,
	UserId char(32) not null comment '用戶Id',
	ClaimType varchar(100) null comment 'ClaimType',
	ClaimValue varchar(100) null comment 'ClaimValue'
) comment 'claims表';

create table aspnetuserlogins
(
	UserId char(32) not null comment '',
	ProviderKey varchar(100) not null comment '',
	LoginProvider varchar(100) not null comment ''
) comment '登陸日志表';

create table aspnetuserroles
(
	UserId char(32) not null comment '',
	RoleId char(32) not null comment ''
) comment '用戶角色表';

create table aspnetroles
(
	Id char(32) primary key,
	Name varchar(50) not null comment ''
) comment '用戶角色表';

第三步:修改ID的默認賦值,默認是36為GUID,修改為32位

    public class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
            this.Id = System.Guid.NewGuid().ToString("N");
        }

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // 請注意,authenticationType 必須與 CookieAuthenticationOptions.AuthenticationType 中定義的相應項匹配
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // 在此處添加自定義用戶聲明
            return userIdentity;
        }
    }

第四步:用戶登錄,兩套代碼(一套是默認的登錄方式,一套是自定義登錄方式)

  默認登錄方式代碼如下:

[HttpPost]
public async Task<ActionResult> Login(string account, string password)
{
    // 1. 利用ASP.NET Identity獲取用戶對象
    var user = await UserManager.FindAsync(account, password);

    if (user == null)
        return Json(new { Flag = false, Content = "用戶名或密碼錯誤!!!" });

    // 2. 利用ASP.NET Identity獲取identity 對象
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

    // 3. 將上面拿到的identity對象登錄
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);

    return Json(new { Flag = true, Content = "登錄成功!!!" });
}

   自定義登錄方式代碼如下:

[HttpPost]
public async Task<ActionResult> Login(string account, string password)
{
    // 1. 利用ASP.NET Identity獲取用戶對象
    var user = await UserManager.FindAsync(account, password);

    if (user == null)
        return Json(new { Flag = false, Content = "用戶名或密碼錯誤!!!" });

    // 驗證用戶密碼和登錄密碼是否一致,FindEmail等方法使用
    // UserManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, password);

    // 2. 利用ASP.NET Identity獲取identity 對象
   var claims = new List<System.Security.Claims.Claim>();

    claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.NameIdentifier, user.Id));
    claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, user.UserName));
    claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity"));
    claims.Add(new System.Security.Claims.Claim("AspNet.Identity.SecurityStamp", user.SecurityStamp));
    
    // 這里可以自定義角色或其他數據
    // claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "user"));

    //聲明身份驗證方式
    var identity = new System.Security.Claims.ClaimsIdentity("ApplicationCookie");

    identity.AddClaims(claims);

    // 3. 將上面拿到的identity對象登錄
    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);

    return Json(new { Flag = true, Content = "登錄成功!!!" });
}

 第五步:用戶注冊,兩套代碼(一套是默認的注冊方式,一套是自定義注冊方式)

  默認注冊方式代碼如下:

[HttpPost]
public async Task<ActionResult> Register(Models.RegisterViewModel model)
{
    var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };

    var result = await UserManager.CreateAsync(user, model.Password);

    if (result.Succeeded)
    {
        return Json(new { Flag = true, Content = "注冊成功!!!" }, JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(new { Flag = false, Content = "注冊失敗!!!" }, JsonRequestBehavior.AllowGet);
    }
}

   自定義注冊方式代碼如下:

[HttpPost]
public async Task<ActionResult> Register(Models.RegisterViewModel model)
{
    var db = new Data.DataContext();

    db.Members.Add(new Data.DomainModels.Member()
    {
        Id = Guid.NewGuid().ToString("N"),
        SecurityStamp = Guid.NewGuid().ToString(),
        Email = model.Email,
        PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password),
        UserName = model.UserName
    });

    var result = await db.SaveChangesAsync();

    if (result > 0)
    {
        return Json(new { Flag = true, Content = "注冊成功!!!" }, JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(new { Flag = false, Content = "注冊失敗!!!" }, JsonRequestBehavior.AllowGet);
    }

}

 好了,到這里我們就已經完成了后台的登錄注冊功能,把代碼抽離之后,再看是不是很簡單的樣子,跟以前的forms認證代碼結構差不多啦,封裝封裝用起來就更方便了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM