Asp.Net Identity 设计目标
微软在 asp.net 2.0 引入了 membership,为 asp.net 应用程序提供身份验证和授权功能。membership 假定用户在网站注册,然后凭用户名和密码登录网站。现在这个假定已经不成立了,web 上社交网络兴起,人们更倾向于使用社交网络登录网站。程序员的开发方式也产生了重大变化,单元测试现已成为开发中的主要关注点。membership 系统对社交网络登录和单元测试都不支持,已经不能适应现阶段的需求了。为此微软开发了 Asp.Net Identity,其目标是:
统一的标识系统
- 可在 asp.net 下所有开发框架下使用,包括 ASP.NET MVC, Web Forms, Web Pages, Web API, and SignalR。
- 可用于构建 web, phone,store 或混合应用程序
易于扩展用户资料(User Profile)
程序员可以控制用户信息的架构。
持久化控制
默认情况下数据保存在关系数据库,使用实体框架 Code First 实现持久化机制。由于数据库架构由程序员控制,可以更改表名和主键数据类型。也可以更改数据存储方式,例如使用 SharePoint 或者 NoSQL 数据库。
这里是使用 NHibernate 代替实体框架实现持久化的项目,https://github.com/nhibernate/NHibernate.AspNet.Identity。
可进行单元测试
可以为用到 Asp.Net Identity 的代码编写单元测试。
角色提供程序
允许基于角色进行授权
基于声明的验证
用户的身份由一组声明(Claims)表示。声明对用户标识的表现力好过角色。用户和角色的关系只有“属于”和“不属于”,声明可以对用户进行更细致的描述。
社交账户登录提供程序
允许使用 facebook,twitter 等社交账号登录,同时在自己的应用程序中存储用户特定的数据。
Azure Active Directory
允许使用 Azure Active Directory 登录,同时在自己的应用程序中存储用户特定的数据。
OWIN 集成
ASP.NET 身份验证基于 OWIN 中间件。ASP.NET Identity 对 System.Web 没有依赖,是一个完全的 OWIN 框架。ASP.NET Identity 使用 OWIN 身份验证,通过 OWIN CookieAuthentication 而不是 FormsAuthentication 生成 cookie。
NuGet 程序包
通过 NuGet 程序包,ASP.NET 开发小组可以在新功能和 bug 修复上快速迭代,并及时向开发者发布。
相关程序包
Microsoft.AspNet.Identity.Core 包含 ASP.NET Identity 的核心接口
Microsoft.AspNet.Identity.OWIN 包含将 ASP.NET Identity 接入到 OWIN 身份验证的功能,在需要调用 OWIN Cookie Authentication 生成 cookie 时使用
Microsoft.AspNet.Identity.EntityFramework 使用实体框架将用户数据保存到 SQL Server 数据库
Asp.Net MVC 中的相关代码
新建项目 mvc 项目时选择个人用户验证方式,项目模板会生成以下代码
在 AccountController.Register 方法中使用 UserManager<TUser, TKey> 的 CreateAsync 方法注册用户:
// AccountController [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) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); return RedirectToAction("Index", "Home"); } AddErrors(result); } return View(model); }
在 AccountController.Login 方法中使用 SignInManager<TUser, TKey> 的 PasswordSignInAsync 方法登录。
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); } // 这不会计入到为执行帐户锁定而统计的登录失败次数中 // 若要在多次输入错误密码的情况下触发帐户锁定,请更改为 shouldLockout: true var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); case SignInStatus.Failure: default: ModelState.AddModelError("", "无效的登录尝试。"); return View(model); } }
原文地址:http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity