向空項目添加 ASP.NET Identity 的基本步驟。 ...
安裝 AspNet.Identity 程式包
Microsoft.AspNet.Identity.Core 包含 ASP.NET Identity 核心介面
Microsoft.AspNet.Identity.EntityFramework ASP.NET Identity 的實體框架提供程式
添加用戶註冊代碼
var userStore = new UserStore<IdentityUser>(); var manager = new UserManager<IdentityUser>(userStore); var user = new IdentityUser() { UserName = ... }; IdentityResult result = manager.Create(user, ...); if (result.Succeeded) { } else { }
- UserStore 實現以下在 ASP.NET Identity Core 中定義的介面:
- IUserStore,公佈用戶管理的基本 api
- IUserLoginStore,此介面將用戶映射到 login 提供程式,例如 Google, Facebook, Twitter
- IUserClaimStore 保存聲明。
- IUserRoleStore 此介面將用戶映射到角色
- IdentityUser 實現在 ASP.NET Identity Core 中定義的 IUser 介面,IUser 介面表示用戶。
- UserManager 公佈向 UserStore 保存更改的 API。
- IdentityResult 在 ASP.NET Identity Core 中定義,表示操作結果。
類間關係如圖:
安裝 Owin 程式包
Microsoft.AspNet.Identity.Owin 包含一組 OWIN 擴展類,用於管理和配置 OWIN 身份驗證中間件,這些類由 ASP.NET Identity.Core 程式包使用。
Microsoft.Owin.Host.SystemWeb 包含一個 OWIN 伺服器,使基於 OWIN 的應用程式可在 IIS 集成管道內運行。
添加 OWIN 啟動類和身份驗證配置類
[assembly: OwinStartup(typeof(Startup))] public partial class Startup { public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // 當用戶登錄時使應用程式可以驗證安全戳。 // 這是一項安全功能,當你更改密碼或者向帳戶添加外部登錄名時,將使用此功能。 OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); } }
OwinStartupAttribute 用於配置啟動類,預設情況下會調用名為 Configuration 的方法,也可通過 MethodName 指定不同的方法名。
修改用戶註冊代碼
使用戶在註冊後自動登錄
var userStore = new UserStore<IdentityUser>(); var manager = new UserManager<IdentityUser>(userStore); var user = new IdentityUser() { UserName = ... }; IdentityResult result = manager.Create(user, ...); if (result.Succeeded) { var authenticationManager = this.HttpContext.GetOwinContext().Authentication; var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity); } else { }
ASP.NET Identity 和 OWIN Cookie Authentication 是基於聲明的,因此需要為用戶生成 ClaimsIdentity 對象。ClaimsIdentity 包含用戶所有的聲明信息,例如,用戶屬於哪些角色。可以在這裡為用戶添加更多聲明。通過調用 AuthenticationManager.SignIn 方法使用戶登錄。IAuthenticationManager 介面在 OWIN 中定義。這段代碼會產生一個 cookie,類似於 Forms 身份驗證的 FormAuthentication.SetAuthCookie 方法。
添加登錄代碼
var userStore = new UserStore<IdentityUser>(); var userManager = new UserManager<IdentityUser>(userStore); var user = userManager.Find(...); if (user != null) { var authenticationManager = this.HttpContext.GetOwinContext().Authentication; var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, userIdentity); // 登錄成功 } else { // 登錄失敗 }
GetOwinContext 是一個擴展方法,在 Microsoft.Owin.Host.SystemWeb 程式集中定義,它返回 IOwinContext 對象,OwinContext 公佈 IAuthenticationManager 屬性,表示對本次請求可用的身份驗證中間件。
添加註銷代碼
var authenticationManager = this.HttpContext.GetOwinContext().Authentication; authenticationManager.SignOut();