您的位置:首页 > 编程语言 > ASP

.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。

一切准备就绪,开始去使用它了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc .net 中间件
相关文章推荐