[转]ASP.NET Core 之 Identity 入门(三)

本文转自:http://www.cnblogs.com/savorboard/p/aspnetcore-identity3.html

前言

在上一篇章中,我们学了
CookieAuthentication 中间件,本篇的说话主要看一下 Identity 本身。

绝早2005年 ASP.NET 2.0 的早晚起, Web
应用程序在拍卖身份验证和授权有矣诸多之转,多矣依手机端,平板等,所以格外时段为了适应这种变动就是引入了ASP.NET
Membership,但是就日的前进有交道网站要程序聚集了大量的用户,比如Facebook,Twitter,QQ等,这个时节用户期待能利用他们当这些社交站点身份来登陆时网站,这样可以破注册这些零碎而与此同时不可或缺之操作,用户也无须记住大量的账户密码。

与此同时随着互联网的提高,越来越多之开发者不只是关爱现实业务代码的编制,转变为发端关注应用程序代码的单元测试,这已是开发者关注的主干。所以在2008年,ASP.NET
团队引入了 MVC
框架,这样来赞助开发者很有益于之构建单元测试,同时开发者希望他们的
Membership 系统为会好这或多或少。

基于以上,ASP.NET Identity 应运而生。

Identity 要解决之题材

无数开发人员说他们不愿意用Identity,自己实现而有利于的差不多,OK,那么需要来了?以下就是是本人本着本次任务让你领取出来的急需。

身价系

  • 可以以叫抱有的ASP.NET 框架下(Web MVC,Web Forms,Web
    Api,SignalR)
  • 可使被构建 Web, 手机,存储,或者夹杂使用。

能够对用户资料(User Profile)很有利的壮大

  • 好对用户资料进行扩展。

持久化

  • 默认把用户信息存储于数据库被,可以支持使用EF进行持久化。(得望,EF
    其实只是Identity的一个成效点而曾经
  • 足控制数据库架构,更改表名或者主键的数据类型(int,string)
  • 得下不同之蕴藏机制(如 NoSQL,DB2等)

单元测试

  • 假若WEB 应用程序可以开展单元测试,可以对ASP.NET Identity编写单元测试

角色机制

  • 供角色机制,可以运用不同之角色来展开不同权的克,可以轻松的创造角色,向用户增长角色当。

若是支持基于Claims

  • 内需支持因 Claims
    的身份验证机制,其中用户位置是一样组Claims,一组Claims可以比较角色有所更强的表现力,而角色就是一个bool值来表示是匪是会员而已。

其三正在社交登陆

  • 好充分便利的下第三在登入,比如 Microsoft 账户,Facebook,
    Twitter,Google等,并且存储用户特定的多寡。

装进为中件

  • 根据中间件落实,不要对现实品种发依赖
  • 因 Authorzation 中间件落实,而非是运用 FormsAuthentication
    来储存cookie。

NuGet包提供

  • 颁布为 Nuget
    包,这样可以好之进展迭代和bug修复,可以灵活的提供给使用者。

上述,就是自领到出来的需要,如果被您来封装这样一个用户身份认证组件,你会不是想到以上之这些功能点,那针对被这些成效点你还要会咋样来规划也罢?

下来拘禁一下 Identity 怎么样设计之吧。

Getting Started

抽丝剥茧,我们先从入口看一下夫行使办法。 首先我们打开 Startup.cs
文件,然后上加如下代码:

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>(options => {
            options.Cookies.ApplicationCookie.AuthenticationScheme = "ApplicationCookie";
            options.Cookies.ApplicationCookie.CookieName = "Interop";
        })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
    }

    public void Configure(IApplicationBuilder app)
    {
        // 使用了 CookieAuthentication 中间件做身份认证
        app.UseIdentity();
    }
}

当 ConfigureServices 中,先是注册了数据库上下文,然后还要
services.AddIdentity() 我们看一下中间还注册了怎样服务呢?

public static IdentityBuilder AddIdentity<TUser, TRole>(
    this IServiceCollection services,
    Action<IdentityOptions> setupAction)
    where TUser : class
    where TRole : class
{
    // 这个就是被 Identity 使用的
    services.AddAuthentication(options =>
    {
        // This is the Default value for ExternalCookieAuthenticationScheme
        options.SignInScheme = new IdentityCookieOptions().ExternalCookieAuthenticationScheme;
    });

    // 注册 IHttpContextAccessor ,会用到
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Identity services
    services.TryAddSingleton<IdentityMarkerService>();
    services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
    services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
    services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
    services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
    services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();

    // 错误描述信息
    services.TryAddScoped<IdentityErrorDescriber>();
    services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();

    //身份当事人工厂
    services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();

    //三大对象
    services.TryAddScoped<UserManager<TUser>, UserManager<TUser>>();
    services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>();
    services.TryAddScoped<RoleManager<TRole>, RoleManager<TRole>>();

    if (setupAction != null)
    {
        services.Configure(setupAction);
    }

    return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
}

圈了以上代码后,基本上知道了 Identity
他的筹划的一个搭了,通过者布局我们啊克学习到我们团结包一个中间件的时段,该如何来团我们的代码结构,怎么样的采取
ASP.NET Core
给我们提供的依靠注入来再次好的解耦,下面我们来拘禁一下由此以上代码我们能够模拟到啊东西:

1、 在
public static IdentityBuilder AddIdentity<TUser, TRole>(this IServiceCollection services,    Action<IdentityOptions> setupAction)
这个扩展方法中,提供了一个参数
Action<IdentityOptions>,这个是干什么用之吧?
这个是咱当规划一个中间件的时刻,有亟待外部提供的参数,就会见规划一个
Options
的类用来接受外部的参数,然后装进为一个Action委托的章程提供。在采用及之地方便得坐
IOption xxx 的款式注入进来使用了。

2、services.TryAddScoped<Interface,Implement>(),这个注册方式就是,如果检测及DI容器里面已经闹矣时如注册的Interface或者Service,就非会见更报了名,没有才见面登记上。
那么为什么这边设这么用呢?
这是因若用户已经实现了这接口并且已登记的器皿中的话,就采取用户注册之,而未是中等件自身的。用户就能非常好之对准中件提供的成效拓展自定义了,这便是OO中之多态性,这虽是里氏替换原则。

3、如果你能够掌握第2长达之言语,那么你应有亮怎么会以劳务遭遇登记
错误描述信息 那个IdentityErrorDescriber
了吧,也克解决你想唤起账号密码错误,无奈Identity输出是英文问题之唤起。

4、三怪目标,这个是 Identity 的着力了,所以读书 Identity
的讲话,在羁押了博客 ASP.NET Core 之 Identity
入门(一,二)之后,学就三个目标就足够了。

SignInManager: 主要处理登记登录相关事情逻辑。

UserManager: 处理用户相关添加删减,修改密码,添加去角色当。

RoleManager:角色相关添加删减更新等。

稍加同学或特别奇怪,都没有借助具体的数据库或者是EF,是安就的增删改查的啊?

夫时段,就待几单 Store
接口派上用场了。以下是Identity中定义之Store接口:

  • IQueryableRoleStore
  • IQueryableUserStore
  • IRoleClaimStore
  • IRoleStore
  • IUserAuthenticationTokenStore
  • IUserClaimStore
  • IUserEmailStore
  • IUserLockoutStore
  • IUserLoginStore
  • IUserPasswordStore
  • IUserPhoneNumberStore
  • IUserRoleStore
  • IUserSecurityStampStore
  • IUserStore
  • IUserTwoFactorStore

发生矣这些接口之后,是无是豁然开朗了,原来 Identity
是通过这种方法贯彻之持久化机制,依赖抽象接口而非是恃具体的底细实现,这即是面向对象中的凭借倒置原则呀。

Identity 和 EntityFramework

Identity 和
EntityFramework的涉及,相信达单章节看明白了之后,就生爱懂了,对之,EF
只是本着被上述 Store 接口的兑现,不信教而看截图的源码:

NoSQL 1

Identity
打头的那些看似公事还是概念的需要持久化的Entity对象,Store结尾的那些即使是接口的贯彻啊。

其三正值的 Identity 实现

除此之外 EF
是法定默认提供的持久化库之外,还有局部叔在的堆栈,当然你啊堪团结以
ADO.NET 或者 Drapper 实现。

MangoDb 针对于 Identity 提供的贯彻:
https://github.com/tugberkugurlu/AspNetCore.Identity.MongoDB

LinqToDB 针对于 Identity
提供的落实:https://github.com/linq2db/LinqToDB.Identity

总结

就篇博文写了蛮久的流年的,一方面是坐当想怎么样的思路来为大家再次好的喻,而不光是运。因为有最多的篇章介绍Identity
的采取办法同代码了,但是最后大家要未见面因此。后来想到要为旁人想使明你的库房也好代码可以,让该知晓诞生的背景是非常重点的,因为这才是计划性的初衷。另一方面是因Connect()
2016 大会上,.NET Core 发布了 1.1
版本,除了将项目升级至1.1外边,也于攻读1.1新的有些事物,以便更好叫大家享受。

授人以鲜鱼勿苟授人以渔,
一篇好之博文确实要花费作者再多的脑子与岁月。如果您以为就首博文对而来帮带,感谢您的【推荐】。

而且,ASP.NET Core 之 Identity 系列也收了,感谢支持之心上人等。如果你针对
.NET Core 感兴趣可以关注我,我会定期在博客分享关于 .NET Core
的学习心得。


正文地址:http://www.cnblogs.com/savorboard/p/aspnetcore-identity3.html
作者博客:Savorboard
欢迎转载,请于显著位置于出出处及链接

 

 

分类: ASP.NET
Core

标签: asp.net
core,
identity

 

网站地图xml地图