.NET MVC5自带模板方法功能解析(3)--ASP.NET Identity
2016-11-09 22:04
597 查看
1.Identity包简介
Identity是依赖于EF的Code First 和Owin的,当然你可以自己拿着Micsoft.AspNet.Identity.Core重写一份不依赖EF的Identity.用户数据库由EF Code First创建,账号等功能通过Owin的中间件形式加入到程序中。Microsoft.AspNet.Identity.EntityFramework
这个包容纳了 ASP.NET Identity 基于 Entity Framework 的实现。它将 ASP.NET Identity 的数据和架构存入 SQL Server。
Microsoft.AspNet.Identity.Core
这个包容纳了 ASP.NET Identity 的核心接口。它可以用来编写 ASP.NET Identity 的其他实现,用以支持其他持久化存储系统,如 Windows Azure 表存储, NoSQL 数据库等等。
Microsoft.AspNet.Identity.OWIN
这个包为 ASP.NET 应用程序提供了将 ASP.NET Identity 引入到 OWIN 身份验证的功能。当你在为应用程序加入登录功能,调用 OWIN Cookie 身份验证中间件来生成 cookie 时,会用到这个包。
2.内置数据库配置
Identity采用EF Code First,他内置了一些类用户创建数据库默认情况下是没有数据库的,直到创建一个新用户,EF才会去创建数据库
这个数据库会创建在App_Data下
因为在Web.config配置了数据库生成位置
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-DefaultMVC5-20160806094030.mdf;Initial Catalog=aspnet-DefaultMVC5-20160806094030;Integrated Security=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" /> </connectionStrings>
3.创建 User 类
第一个要被创建的类它代表用户,我将它命名为AppUser,继承自Microsoft.AspNet.Identity.EntityFramework 名称空间下IdentityUser,IdentityUser 提供了基本的用户信息,如Email、PasswordHash、UserName、PhoneNumber、Roles等,当然我们也可以在其派生类中添加额外的信息,代码如下:public class AppUser : IdentityUser { public string RealName { get; set; } }
4. Database Context 类
接下来的步骤就是创建EF Database Context 来操作AppUser。ASP.NET Identity将使用Code First 来创建和管理数据库架构。值得注意的是,Database Context必须继承自IdentityDbContext,而且T为User类(在此示例即AppUser),代码如下所示:public class MyIdentityDbContext : IdentityDbContext<AppUser> { //可以在这里扩展自己的表,配置数据表 public MyIdentityDbContext() : base("DefaultConnection", throwIfV1Schema: false) { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } }
5.UserManager
User Manager类作为ASP.NET Identity中最为重要的类之一,用来管理User。同样,自定义的User Manger类必须继承自UserManager,此处T就为AppUser。
UserManager提供了创建和操作用户的一些基本方法并且全面支持C# 异步编程,所以你可以使用CreateAsync(Create),FindAsync(Find)、DeleteAsync(Delete)、UpdateAsync(Update)来进行用户管理,值得注意的是,它并不通过Entity Framework 来直接操作用户,而是间接调用UserStore来实现。
UserStore是Entity Framework 类并实现了IUserStore接口,并且实现了定义在UserManger中操作用户的方法。代码如下所示:
/// <summary> /// 用户管理 /// </summary> public class AppUserManager : UserManager<AppUser> { public AppUserManager(IUserStore<AppUser> store) : base(store) { } public static AppUserManager Create( IdentityFactoryOptions<AppUserManager> options, IOwinContext context) { AppIdentityDbContext db = context.Get<AppIdentityDbContext>(); //UserStore<T> 是 包含在 Microsoft.AspNet.Identity.EntityFramework 中,它实现了 UserManger 类中与用户操作相关的方法。 //也就是说UserStore<T>类中的方法(诸如:FindById、FindByNameAsync...)通过EntityFramework检索和持久化UserInfo到数据库中 AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db)); return manager; } }
上述代码中,静态的Create方法将返回AppUserManger实例,它用来操作和管理用户,值得注意的是,它需要传入OwinContext对象,通过该上下文对象,获取到存储在Owin环境字典中的Database Context实例。
6.MySignInManager
// 配置要在此应用程序中使用的应用程序登录管理器。 public class MySignInManager : SignInManager<AppUser, string> { public MySignInManager(AppUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task<ClaimsIdentity> CreateUserIdentityAsync(AppUser user) { return user.GenerateUserIdentityAsync((AppUserManager)UserManager); } public static MySignInManager Create(IdentityFactoryOptions<MySignInManager> options, IOwinContext context) { return new MySignInManager(context.GetUserManager<AppUserManager>(), context.Authentication); } }
7.OWIN Startup
通过Katana(OWIN的实现)提供的API,将Middleware 中间件注册到Middleware中,如下所示:public void ConfigureAuth(IAppBuilder app) { // 配置数据库上下文、用户管理器和登录管理器,以便为每个请求使用单个实例 app.CreatePerOwinContext(AppIdentityDbContext.Create); app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create); // 使应用程序可以使用 Cookie 来存储已登录用户的信息 // 并使用 Cookie 来临时存储有关使用第三方登录提供程序登录的用户的信息 // 配置登录 Cookie app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); }
上述代码中,通过CreatePerOwinContext方法将AppIdentityDbContext和 AppUserManager的实例注册到OwinContext中,这样确保每一次请求都能获取到相关ASP.NET Identity对象,而且还能保证全局唯一。
当我们要获取对象时,一般这样调用
HttpContext.GetOwinContext().Get<UserManager>(); HttpContext.GetOwinContext().GetUserManager<MySignInManager>();
UseCookieAuthentication 方法指定了身份验证类型为ApplicationCookie,同时指定LoginPath属性,当Http请求内容认证不通过时重定向到指定的URL。
一切准备就绪,开始去使用它了
相关文章推荐
- C#设计模式之Template模板方法模式实现ASP.NET自定义控件 密码强度检测功能
- .NET MVC5自带模板方法功能解析(2)
- asp.net 非常简易的新闻发布系统,结合了ajax,json,Nvelocity模板引擎,只完成了一部分功能,非常适合新手看,我以前是学java方向的,刚接触.net,做的不好的别喷哈
- .NET MVC5自带模板方法功能解析(1)
- ASP.NET MVC使用RazorEngine解析模板生成静态页
- [.Net码农]ASP.NET缓存管理的几种方法
- ASP.NET 2.0 本地化功能:本地化 Web 应用程序的新方法
- ASP.net中Gridview修改表头后没有排序功能的解决方法
- MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN
- ASP.NET 中使用WebServer进行调试时,自定义的Identity出现 SerializationException的解决方法
- 用.net自带的类发送E_Mail(ASP.NET+C#)
- C# ASP.NET 最常用的通用权限的3个方法例子展示(每个功能一行代码实现)
- 菜鸟蔡之Ajax复习第一篇(后台asp.net)(传统的JavaScript方法实现Ajax功能)
- ASP.NET 2.0 本地化功能:本地化 Web 应用程序的新方法
- ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
- .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
- 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
- asp.net GridView模板列中实现选择行功能
- [ASP.NET] ASP.NET Identity 中 ClaimsIdentity 解析
- asp.net 配置 web.config 禁用VS2013自带的Browser Link功能