最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解ASP.NET Core 之 Identity 入門(三)

 更新時(shí)間:2016年12月13日 17:03:25   作者:Savorboard  
本篇文章主要介紹了ASP.NET Core 之 Identity 入門,主要負(fù)責(zé)對用戶的身份進(jìn)行認(rèn)證,有興趣的可以了解一下。

前言

最早2005年 ASP.NET 2.0 的時(shí)候開始, Web 應(yīng)用程序在處理身份驗(yàn)證和授權(quán)有了很多的變化,多了比如手機(jī)端,平板等,所以那個(gè)時(shí)候?yàn)榱诉m應(yīng)這種變化就引入了ASP.NET Membership,但是隨著時(shí)間的發(fā)展一些社交網(wǎng)站或者程序聚集了大量的用戶,比如Facebook,Twitter,QQ等,這個(gè)時(shí)候用戶希望能夠使用他們在這些社交站點(diǎn)身份來登陸當(dāng)前網(wǎng)站,這樣可以免除注冊這些瑣碎而又必要的操作,用戶也不必記住大量的賬戶密碼。

又隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的開發(fā)者不只是關(guān)注具體業(yè)務(wù)代碼的編寫,轉(zhuǎn)變?yōu)殚_始關(guān)注應(yīng)用程序代碼的單元測試,這已經(jīng)是開發(fā)者關(guān)注的核心。所以在2008年,ASP.NET 團(tuán)隊(duì)引入了 MVC 框架,這樣來幫助開發(fā)者很方便的構(gòu)建單元測試,同時(shí)開發(fā)者希望他們的 Membership 系統(tǒng)也能夠做到這一點(diǎn)。

基于以上,ASP.NET Identity 應(yīng)運(yùn)而生。

Identity 要解決的問題

很多開發(fā)人員說他們不愿意使用Identity,自己實(shí)現(xiàn)要方便的多,OK,那么需求來了?以下就是我針對此次任務(wù)給你提出來的需求。

身份系統(tǒng)

  • 可以同時(shí)被所有的ASP.NET 框架使用(Web MVC,Web Forms,Web Api,SignalR)
  • 可以應(yīng)用于構(gòu)建 Web, 手機(jī),存儲,或者混合應(yīng)用。

能夠?qū)τ脩糍Y料(User Profile)很方便的擴(kuò)展

  • 可以針對用戶資料進(jìn)行擴(kuò)展。

持久化

  • 默認(rèn)把用戶信息存儲在數(shù)據(jù)庫中,可以支持使用EF進(jìn)行持久化。(可以看到,EF 其實(shí)只是Identity的一個(gè)功能點(diǎn)而已)
  • 可以控制數(shù)據(jù)庫架構(gòu),更改表名或者主鍵的數(shù)據(jù)類型(int,string)
  • 可以使用不同的存儲機(jī)制(如 NoSQL,DB2等)

單元測試

  • 使WEB 應(yīng)用程序可以進(jìn)行單元測試,可以針對ASP.NET Identity編寫單元測試

角色機(jī)制

  • 提供角色機(jī)制,可以使用不同的角色來進(jìn)行不同權(quán)限的限制,可以輕松的創(chuàng)建角色,向用戶添加角色等。

要支持基于Claims

  • 需要支持基于 Claims 的身份驗(yàn)證機(jī)制,其中用戶身份是一組Claims,一組Claims可以比角色擁有更強(qiáng)的表現(xiàn)力,而角色僅僅是一個(gè)bool值來表示是不是會員而已。

第三方社交登陸

  • 可以很方便的使用第三方登入,比如 Microsoft 賬戶,F(xiàn)acebook, Twitter,Google等,并且存儲用戶特定的數(shù)據(jù)。

封裝為中間件

  • 基于中間件實(shí)現(xiàn),不要對具體項(xiàng)目產(chǎn)生依賴
  • 基于 Authorzation 中間件實(shí)現(xiàn),而不是使用 FormsAuthentication 來存儲cookie。

NuGet包提供

  • 發(fā)布為 Nuget 包,這樣可以容易的進(jìn)行迭代和bug修復(fù),可以靈活的提供給使用者。

以上,就是我提出來的需求,如果讓你來封裝這樣一個(gè)用戶身份認(rèn)證組件,你會不是想到以上的這些功能點(diǎn),那針對于這些功能點(diǎn)你又會怎么樣來設(shè)計(jì)呢?

下面來看一下 Identity 怎么樣設(shè)計(jì)的吧。

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 中間件做身份認(rèn)證
    app.UseIdentity();
  }
}

在 ConfigureServices 中,先是注冊了數(shù)據(jù)庫上下文,然后又 services.AddIdentity() 我們看一下里面都注冊了哪些服務(wù)呢?

public static IdentityBuilder AddIdentity<TUser, TRole>(
  this IServiceCollection services,
  Action<IdentityOptions> setupAction)
  where TUser : class
  where TRole : class
{
  // 這個(gè)就是被 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>>();
  
  // 錯(cuò)誤描述信息
  services.TryAddScoped<IdentityErrorDescriber>();
  services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
  
  //身份當(dāng)事人工廠
  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 他的設(shè)計(jì)的一個(gè)架構(gòu)了,通過此結(jié)構(gòu)我們也能夠?qū)W習(xí)到我們自己封裝一個(gè)中間件的時(shí)候,該怎么樣來組織我們的代碼結(jié)構(gòu),怎么樣的利用 ASP.NET Core 給我們提供的依賴注入來更好的解耦,下面我們來看一下通過以上代碼我們能夠?qū)W到什么東西:

1、 在 public static IdentityBuilder AddIdentity<TUser, TRole>(this IServiceCollection services, Action<IdentityOptions> setupAction) 這個(gè)擴(kuò)展方法中,提供了一個(gè)參數(shù) Action<IdentityOptions>,這個(gè)是干什么用的呢? 這個(gè)是我們在設(shè)計(jì)一個(gè)中間件的時(shí)候,有需要外部提供的參數(shù),就會設(shè)計(jì)一個(gè) Options 的類用來接受外部的參數(shù),然后封裝為一個(gè)Action委托的方式提供。在使用到的地方就可以以 IOption xxx 的形式注入進(jìn)來使用了。

2、services.TryAddScoped<Interface,Implement>(),這個(gè)注冊方式就是說,如果檢測到DI容器里面已經(jīng)有了當(dāng)前要注冊的Interface或者Service,就不會再次注冊,沒有才會注冊進(jìn)去。 那么為什么此處要這樣用呢? 這是因?yàn)槿绻脩粢呀?jīng)實(shí)現(xiàn)了此接口并且已經(jīng)注冊的容器當(dāng)中的話,就使用用戶注冊的,而不是中間件自身的。用戶就能很好的對中間件提供的功能進(jìn)行自定義了,這就是OO中的多態(tài)性,這就是里氏替換原則。

3、如果你能理解第2條的話,那么你應(yīng)該知道為什么會在服務(wù)中注冊 錯(cuò)誤描述信息 那個(gè)IdentityErrorDescriber 了吧,也能夠解決你想提示賬號密碼錯(cuò)誤,無奈Identity輸出是英文問題的提示。

4、三大對象,這個(gè)是 Identity 的核心了,所以學(xué)習(xí) Identity 的話,在看完博客 ASP.NET Core 之 Identity 入門(一,二)之后,學(xué)這三個(gè)對象就夠了。

  • SignInManager: 主要處理注冊登錄相關(guān)業(yè)務(wù)邏輯。
  • UserManager: 處理用戶相關(guān)添加刪除,修改密碼,添加刪除角色等。
  • RoleManager:角色相關(guān)添加刪除更新等。

有些同學(xué)可能很好奇,都沒有依賴具體的數(shù)據(jù)庫或者是EF,是怎么樣做到的增刪改查的呢?

這個(gè)時(shí)候,就需要幾個(gè) Store 接口派上用場了。以下是Identity中定義的Store接口:

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

有了這些接口之后,是不是豁然開朗了,原來 Identity 是通過這種方式實(shí)現(xiàn)的持久化機(jī)制,依賴抽象接口而不是依賴具體的細(xì)節(jié)實(shí)現(xiàn),這就是面向?qū)ο笾械囊蕾嚨怪迷瓌t呀。

Identity 和 EntityFramework

Identity 和 EntityFramework的關(guān)系,相信上個(gè)章節(jié)看懂了之后,就很容易明白了,對的,EF 只是針對于上述 Store 接口的實(shí)現(xiàn),不信你看截圖的源碼:

Identity 打頭的那些類文件都是定義的需要持久化的Entity對象,Store結(jié)尾的那些就是接口的實(shí)現(xiàn)啦。

第三方的 Identity 實(shí)現(xiàn)

除了 EF 是官方默認(rèn)提供的持久化庫之外,還有一些第三方的庫,當(dāng)然你也可以自己使用 ADO.NET 或者 Drapper 實(shí)現(xiàn)。

MangoDb 針對于 Identity 提供的實(shí)現(xiàn): https://github.com/tugberkugurlu/AspNetCore.Identity.MongoDB

LinqToDB 針對于 Identity 提供的實(shí)現(xiàn):https://github.com/linq2db/LinqToDB.Identity

總結(jié)

這篇博文寫了蠻久的時(shí)間的,一方面是因?yàn)樵跇?gòu)思怎么樣的思路來讓大家更好的理解,而不僅僅是使用。因?yàn)橛刑嗟奈恼陆榻BIdentity 的使用方式以及代碼了,但是最后大家還是不會用。后來想到如果讓別人想要理解你的庫也好代碼也好,讓其知道誕生的背景是很重要的,因?yàn)檫@才是設(shè)計(jì)的初衷。另一方面是因?yàn)镃onnect() 2016 大會上,.NET Core 發(fā)布了 1.1 版本,除了把項(xiàng)目升級到1.1之外,也在學(xué)習(xí)1.1新的一些東西,以便更好給大家分享。

相關(guān)文章

  • asp.net小孔子cms中的數(shù)據(jù)添加修改

    asp.net小孔子cms中的數(shù)據(jù)添加修改

    最近都在看小孔子cms的代碼,其添加與修改數(shù)據(jù)十分方便,做下筆記,代碼主要提取自小孔子cms,去掉了不用的函數(shù)并把相關(guān)代碼寫到一個(gè)文件中
    2008-08-08
  • ASP.NET XmlHttp跨域訪問實(shí)現(xiàn)代碼

    ASP.NET XmlHttp跨域訪問實(shí)現(xiàn)代碼

    最近項(xiàng)目需要實(shí)現(xiàn)XmlHttp的POST方法到另一服務(wù)器上的頁面進(jìn)行數(shù)據(jù)的更新,可是IE會提出“該頁正在訪問其控制范圍之外的信息,是否繼續(xù)?”等警告信息,而在其他瀏覽器上直接禁止掉,GOOGLE一下原來是XmlHttp的跨域訪問問題,找了很多資料,說是提供很多解決方案,可是都沒有用處。
    2008-11-11
  • html+ashx 表單提交示例

    html+ashx 表單提交示例

    這篇文章主要介紹了html+ashx 表單提交的具體實(shí)現(xiàn),需要的朋友可以參考下
    2014-03-03
  • .NET9?EFcore支持早期MSSQL數(shù)據(jù)庫?ROW_NUMBER()分頁功能

    .NET9?EFcore支持早期MSSQL數(shù)據(jù)庫?ROW_NUMBER()分頁功能

    文章介紹了如何在.NET?9中使用EF?Core實(shí)現(xiàn)對早期MSSQL數(shù)據(jù)庫的ROW_NUMBER()分頁兼容,由于EF?Core?9對底層API進(jìn)行了重大更新,原有的兼容代碼需要重新實(shí)現(xiàn),具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2024-11-11
  • datatable行轉(zhuǎn)列示例分享

    datatable行轉(zhuǎn)列示例分享

    這篇文章主要介紹了datatable行轉(zhuǎn)列示例,指定需要轉(zhuǎn)換的表和轉(zhuǎn)換表表頭對應(yīng)舊表字段就可以轉(zhuǎn)換了
    2014-01-01
  • 分析10個(gè)ASP.NET控件最有用的屬性詳解

    分析10個(gè)ASP.NET控件最有用的屬性詳解

    對于微軟平臺開發(fā)人員而言,每天都要和各種ASP.NET控件打交道,本文不打算介紹各種控件的具體使用方法,相反,我只想和大家分享一下ASP.NET控件最有用的10個(gè)屬性,相信讀完本文可提升你的開發(fā)技能。
    2011-08-08
  • ASP.NET MVC實(shí)現(xiàn)文件下載

    ASP.NET MVC實(shí)現(xiàn)文件下載

    這篇文章介紹了ASP.NET MVC實(shí)現(xiàn)文件下載的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • .NET Core 1.0創(chuàng)建Self-Contained控制臺應(yīng)用

    .NET Core 1.0創(chuàng)建Self-Contained控制臺應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了.NET Core 1.0創(chuàng)建Self-Contained控制臺應(yīng)用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Asp.Net實(shí)現(xiàn)404頁面與301重定向的方法

    Asp.Net實(shí)現(xiàn)404頁面與301重定向的方法

    這篇文章主要介紹了Asp.Net實(shí)現(xiàn)404頁面與301重定向的方法,較為詳細(xì)的分析了404頁面的原理與針對404錯(cuò)誤與301跳轉(zhuǎn)的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • Asp.net core中RedisMQ的簡單應(yīng)用實(shí)現(xiàn)

    Asp.net core中RedisMQ的簡單應(yīng)用實(shí)現(xiàn)

    這篇文章主要介紹了Asp.net core中RedisMQ的簡單應(yīng)用實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

大荔县| 西华县| 磐石市| 临海市| 彩票| 本溪市| 克拉玛依市| 龙泉市| 德阳市| 叶城县| 探索| 桑日县| 红桥区| 灵武市| 武宣县| 安远县| 兴宁市| 三明市| 鲁山县| 商南县| 南澳县| 车致| 淅川县| 平凉市| 辽阳县| 资源县| 临夏市| 呼伦贝尔市| 连州市| 江津市| 汝南县| 江陵县| 利川市| 五莲县| 湖南省| 汤阴县| 东阳市| 台东县| 泸溪县| 清原| 左贡县|