自定義ASP.NET MVC身份驗證(Identity)資訊
自定義ASP.NET MVC身份驗證資訊
1.前言
2.正文
ASP.NET 身份驗證(Identity)是ASP.NET應用的新一代身份認證(membership)系統。想要了解更多關於ASP.NET Identity的資訊請訪問http://blogs.msdn.com/b/webdev/archive/2013/06/27/introducing-asp-net-identity-membership-system-for-asp-net-applications.aspx
ASP.NET Identity的一個主要特點就是能夠很方便地增加使用者身份資訊(profile information)。在已有的ASP.NET Membership系統中,使用者和身份資訊(profile)被分割到不同的表中,並且通過profile 提供程式(provider)來檢索(retrieve)使用者資訊。這就使得自定義身份資訊(profile information)並將其與使用者和應用程式資料關聯(associate)起來變得很困難。ASP.NET Identity可以很方便地向你的使用者新增身份資訊(profile information)。
【更新】增加如何儲存身份資訊到不同的表中的資訊
【更新】Rick Anderson 的網站上還有一個關於如何增加安全登入(social logins)的專題。請通過
這個章節展示了在VS2013中如何自定義使用者身份資訊。以下是增加身份資訊的步驟:
- 在VS2013中,新建一個ASP.NET MVC應用
- 你也可以建立一個Web Forms應用然後使用相同的步驟來增加身份資訊
- 執行應用程式並註冊一個使用者
- 你應該注意到在註冊頁面,程式只要求輸入使用者名稱和密碼。假設,在註冊使用者時,你想要再新增一個出生年月作為使用者的必填項。
- 啟用Entity Framework的遷移功能(migrations)
- 建議(recommend)在修改資料庫結構(schema)或者更改資料模型(Code first model)時使用遷移功能。ASP.NET Identity使用entity framework 作為基本框架(underlying framework)。更多關於遷移的內容,請訪問
- 開啟包管理器控制檯(package manager console)
- 輸入“Enable-Migrations” 然後 回車
- 建議(recommend)在修改資料庫結構(schema)或者更改資料模型(Code first model)時使用遷移功能。ASP.NET Identity使用entity framework 作為基本框架(underlying framework)。更多關於遷移的內容,請訪問
- 增加你想要新增的身份資訊屬性
- 在我們的示例中,我們將要增加一個生日屬性
- 進入 Models\IdentityModels.cs 然後 新增如下屬性到 ApplicationUser中。
public class ApplicationUser : IdentityUser { public DateTime BirthDate { get; set; } }
- 新增
using System;
- Add-Migrations修改資料庫
- 由於我們給使用者添加了新的屬性,所有為了反映這種變化我們需要更新資料庫。這是EF遷移真正有用的地方。你可以通過以下步驟來遷移改變資料庫
- 開啟包管理器控制檯(package manager console)
- 輸入“Add-Migration birthdate” 然後 回車
- 這會在你的專案中增加一個遷移文件
- 更新資料庫
- 在包管理器控制檯輸入“Update-Database” 然後 回車
- 這個命令會執行所有的遷移檔案並且改變資料庫結構
- 資料庫效果
- 修改應用程式來增加BirthDate欄位
- 以下步驟具體(specific)說明了如何向MVC中增加檢視,但是你也可以在WebForm中進行相似的檢視渲染(render)。
- 向Models\AccountViewModels.cs的RegisterViewModel 增加 BirthDate
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "電子郵件")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 必須至少包含 {2} 個字元。", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "密碼")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "確認密碼")]
[Compare("Password", ErrorMessage = "密碼和確認密碼不匹配。")]
public string ConfirmPassword { get; set; }
#region custom
public DateTime BirthDate { get; set; }
#endregion
}
- 更新 Views\Account 的Register.cshtml 檢視
- 更新AccountController.cs中的Register來儲存BirthDate
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email,BirthDate=model.BirthDate };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// 如果我們進行到這一步時某個地方出錯,則重新顯示錶單
return View(model);
}
- 執行應用程式並註冊使用者。如下所示你將會看到BirthDate
- 在頁面中顯示身份資訊
- 當用戶登入成功時,你可以通過一下方式顯示身份資訊
- 通過身份驗證系統(ASP.NET Identity System)獲取使用者ID
var currentUserId = User.Identity.GetUserId();
- 通過身份驗證系統,例項化使用者管理(UserManager)物件
var manager = new UserManager<MyUser>(new UserStore<MyUser>(new MyDbContext()));
- 獲取使用者
var currentUser = manager.FindById(User.Identity.GetUserId());
- 獲取具體的身份資訊
currentUser.BirthDate
在不同的資料庫表中新增身份資訊
以上部分展示給你一種簡單地在使用者表中新增使用者身份資訊的方法。由於ASP.NET Identity使用了Entity Framework,你可以自定義使用者資訊。先在假設,你想將身份資訊新增到不同的資料庫表中。
- 增加一個新的類來儲存身份資訊
public class MyUser:IdentityUser
{
public virtual MyUserInfo MyUserInfo { get; set; }
}
public class MyUserInfo
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class MyDbContext : IdentityDbContext<MyUser>
{
public MyDbContext()
: base("DefaultConnection")
{
}
public System.Data.Entity.DbSet<MyUserInfo> MyUserInfo { get; set; }
}
通過這種方法,執行應用程式你將會在名為MyUserInfo的表中得到FirstName和LastName
- 在頁面中顯示身份資訊
- 當用戶登入成功時,你可以通過一下方式顯示身份資訊
- 通過身份驗證系統(ASP.NET Identity System)獲取使用者ID
var currentUserId = User.Identity.GetUserId();
- 通過身份驗證系統,例項化使用者管理(UserManager)物件
var manager = new UserManager<MyUser>(new UserStore<MyUser>(new MyDbContext()));
- 獲取使用者
var currentUser = manager.FindById(User.Identity.GetUserId());
- 獲取具體的身份資訊
currentUser.MyUserInfo.FirstName
總結
本章講述瞭如何自定義使用者的身份資訊。如果你有任何疑問,請評論或在twitter(@rustd)
譯者後記
- 文章最後將身份資訊放到不同表中的方法,我還沒有實現。沒有查到問題。