认识ASP.NET Membership
ASP.NET Membership是为了解决网站会员的需求在2005年是很常见的,涉及表单验证,和SQL Server数据库用户名、密码和配置文件数据。今天有一个更广泛的一系列数据存储选项为web应用程序,和大多数开发人员想要让他们的网站使用社会身份提供者进行身份验证和授权功能。ASP.NET Membership的局限性的设计使这个转变困难:
- 数据库架构受限于SQL Server。对其他数据库很难兼容。
- 生硬的表存储结构。如果需要添加额外的用户资料信息,需要存储在其他表,使得这些信息难以访问(除非通过 Profile Provider API)。
- 系统仅依据关系数据库设计。当然,你也可以写一个面向非关系型数据库的Provider(例如 Windows Azure 存储表),但是不得不写大量的代码,来解决兼容问题。
- 不能使用OWIN。由于登录、注销功能基于表单认证,第三方账号的接入显得比较困难。
OWIN (Open Web Interface for .NET):
OWIN 是一种定义 Web 服务器和应用程序组件之间的交互的规范 。这一规范的目的是发展一个广阔且充满活力的、基于 Microsoft .NET Framework 的 Web 服务器和应用程序组件生态系统。
Katana 是开源的的OWIN框架,主要用于微软.NET应用程序。Katana 2.0 将随 Visual Studio 2013 一起发布。 新版本有两个值得关注的方面:
为自托管提供核心基础结构组件。
提供了一套丰富的验证中间件(包括 Facebook、Google、Twitter 和 Microsoft Account 这样的社交提供商)以及适用于 Windows Azure Active Directory、cookie 和联合身份验证的提供程序。
更多信息参考 http://owin.org/
鉴于ASP.NET Membership的弊端,微软又开发一套新的安全框架ASP.NET Identity。ASP.NET Identity具有以下优势:
统一的框架
可以轻松地整合到 ASP.NET 各种框架以及程序上。例如,ASP.NET MVC, Web Forms, Web Pages, Web API 和 SignalR等。
自定义用户信息
可以很方便的扩展用户信息。比如,添加用户的生日,年龄等。
灵活的角色管理
ASP.NET Identity 中的角色提供程序让你可以基于角色来限制对应用程序某个部分的访问。你可以很容易地创建诸如 “Admin” 之类的角色,并将用户加入其中。
数据持久性以及兼容性
默认情况下,ASP.NET Identity 系统将所有的数据存储在SQL Server数据库中,并且使用 Entity Framework Code First 实现数据库的管理。
当然,对其他存储介质也有很好的支持。例如 SharePoint, Windows Azure 存储表服务, NoSQL 数据库等等。
单元测试能力
ASP.NET Identity 使得 Web 应用程序能够更好地进行单元测试。
OWIN 集成
ASP.NET 验证(Authentication)基于 OWIN 中间件,可以在任何 OWIN 的宿主上使用。ASP.NET Identity 不依赖于System.Web,完全兼容 OWIN 框架,可以被用在任何由OWIN 承载的应用程序。
NuGet 包
ASP.NET Identity 作为一个 NuGet 包进行发布,并且在 Visual Studio 2013 中作为 ASP.NET MVC, Web Forms 和 Web API 项目模板的一部分提供。你也可以从 NuGet 库中下载到该 NuGet 包。
这种发布方式使得 ASP.NET 团队能够为了添加新功能或者进行 BUG 修复更好的进行迭代,更加敏捷的进行发布给开发人员。
灵活的角色管理
ASP.NET Identity 中的角色提供程序让你可以基于角色来限制对应用程序某个部分的访问。你可以很容易地创建诸如 “Admin” 之类的角色,并将用户加入其中。
数据持久性以及兼容性
默认情况下,ASP.NET Identity 系统将所有的数据存储在SQL Server数据库中,并且使用 Entity Framework Code First 实现数据库的管理。
当然,对其他存储介质也有很好的支持。例如 SharePoint, Windows Azure 存储表服务, NoSQL 数据库等等。
单元测试能力
ASP.NET Identity 使得 Web 应用程序能够更好地进行单元测试。
OWIN 集成
ASP.NET 验证(Authentication)基于 OWIN 中间件,可以在任何 OWIN 的宿主上使用。ASP.NET Identity 不依赖于System.Web,完全兼容 OWIN 框架,可以被用在任何由OWIN 承载的应用程序。
NuGet 包
ASP.NET Identity 作为一个 NuGet 包进行发布,并且在 Visual Studio 2013 中作为 ASP.NET MVC, Web Forms 和 Web API 项目模板的一部分提供。你也可以从 NuGet 库中下载到该 NuGet 包。
这种发布方式使得 ASP.NET 团队能够为了添加新功能或者进行 BUG 修复更好的进行迭代,更加敏捷的进行发布给开发人员。
ASP.NET Identity主要包括核心功能模块、EntityFramework模块以及OWIN模块。具体如下:
Microsoft.AspNet.Identity.Core
核心库,包含Identity的主要功能。
Microsoft.AspNet.Identity.EntityFramework
主要包括ASP.NET Identity 的EF 部分的实现。
Microsoft.AspNet.Identity.OWIN
ASP.NET Identity对OWIN 的支持。
Microsoft.AspNet.Identity.Core
核心库,包含Identity的主要功能。
Microsoft.AspNet.Identity.EntityFramework
主要包括ASP.NET Identity 的EF 部分的实现。
Microsoft.AspNet.Identity.OWIN
ASP.NET Identity对OWIN 的支持。
开始使用ASP.NET Identity
ASP.NET Identity在Visual Studio 2013的项目模板用于
ASP.NET MVC、
Web Forms、Web API和
SPA。在这个介绍中,我们将演示如何使用ASP.NET Identity将功能添加到注册、登录和注销用户。
ASP.NET Identity使用下列程序实现。这篇文章的目的是给你一个高水平的ASP.NET Identity的概述,你可以跟随它一步一步来或者只是读细节。更多详细说明创建应用程序使用ASP.NET Identity,包括使用新的API添加用户、角色和配置文件的信息,请在本文的结尾部分参阅下面的步骤。
ASP.NET Identity使用下列程序实现。这篇文章的目的是给你一个高水平的ASP.NET Identity的概述,你可以跟随它一步一步来或者只是读细节。更多详细说明创建应用程序使用ASP.NET Identity,包括使用新的API添加用户、角色和配置文件的信息,请在本文的结尾部分参阅下面的步骤。
1.创建一个ASP.NET MVC应用程序与个人账户。您可以在ASP.NET MVC、 Web Forms、Web API,SignalR等等中使用ASP.NET Identity 。在本文中,我们将开始一个
ASP.NET MVC应用程序
2.创建的项目为ASP.NET Identity包含以下三个包。
Microsoft.AspNet.Identity.EntityFramework
这个包实现ASP.NET Identity的实体框架,将ASP.NET Identity数据和模式传送到SQL Server。
Microsoft.AspNet.Identity.Core
这个包有ASP.NET Identity的核心接口。这个包可以用来编写一个实现ASP.NET Identity目标不同的持久性存储,比如Azure表存储,NoSQL数据库等。
Microsoft.AspNet.Identity.OWIN
这个包包含的功能用于在ASP.NET应用程序插入OWIN认证与ASP.NET Identity。这是当你登录的功能添加到您的应用程序调用OWIN Cookie验证中间件来生成一个Cookie使用。
Identity以包的形式发布在NuGet上,这能够很方便的将它安装到任意项目中,通过在Package Manger Console输入如下命令来安装Identity:
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.OWIN
Install-Package Microsoft.Owin.Host.SystemWeb
3.创建一个用户。
启动应用程序,然后点击注册链接创建一个用户。下面的图片显示了注册页面它收集用户名和密码。
当用户单击注册按钮,注册的帐户控制器创建用户通过调用ASP.NET Identity API,如下显示:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.UserName };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
4.登录
如果用户成功创建,由 SignInAsync方法登录。
如果用户成功创建,由 SignInAsync方法登录。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.UserName };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(
user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(
new AuthenticationProperties() {
IsPersistent = isPersistent
}, identity);
}
上面SignInAsync方法生成一个ClaimsIdentity。因为ASP.NET Identity和OWIN Cookie验证声明式系统框架要求应用程序为用户生成一个ClaimsIdentity。ClaimsIdentity有所有的用户信息,如用户所属的角色。您还可以在这个阶段添加更多的用户。
下面代码在SignInAsync方法通过使用OWIN的AuthenticationManager 和SignIn和调用ClaimsIdentity传递。
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(
user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(
new AuthenticationProperties() {
IsPersistent = isPersistent
}, identity);
}
5.注销。
点击注销链接在account controller调用 LogOff行为
点击注销链接在account controller调用 LogOff行为
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
上面代码显示了OWIN AuthenticationManager.
SignOut方法。这是类似于FormsAuthentication.SignOut FormsAuthentication模块在Web表单所使用的方法。