中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何入門ASP.NETCore中的Identity

發布時間:2021-09-16 11:48:54 來源:億速云 閱讀:124 作者:柒染 欄目:開發技術

這篇文章給大家介紹如何入門ASP.NETCore中的Identity ,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 組件庫,負責對用戶的身份進行認證,總體來說的話,沒有MVC 5 里面那么復雜,因為在MVC 5里面引入了OWIN的東西,所以很多初學者在學習來很費勁,對于 Identity 都是一頭霧水,包括我也是,曾經在學 identity 這個東西前后花了一個多月來搞懂里面的原理。所以大部分開發者對于 Identity 并沒有愛,也并沒有使用它,會覺得被綁架。

值得慶幸的是,在 ASP.NET Core 中,由于對模塊的抽象化逐漸清晰,以及中間件的使用,這使得 Identity 的學習和使用路線變得更加平易近人。

Getting Started

在開始之前,讓我們先忘記它和Entity Framework的關系,也忘記它和Authentication的關系,我們先學習幾個英語單詞。

有這么幾個“單詞”你可能需要弄明白:

# 1: Claims

大家應該都知道身份證長什么樣子的,如下:

 如何入門ASP.NETCore中的Identity

其中,姓名:奧巴馬;性別:男;民族:肯尼亞;出生:1961.08.04,等等這些身份信息,可以看出都是一個一個的鍵值對,那如果我們想在程序中存這些東西,怎么樣來設計呢?對,你可能想到了使用一個字典進行存儲,一個Key,一個Value剛好滿足需求。但是Key,Value的話感覺不太友好,不太面向對象,所以如果我們做成一個對象的話,是不是更好一些呢?最起碼你可以用vs的智能提示了吧,我們修改一下,改成下面這樣:

//我給對象取一個名字叫`Claim`你沒有意見吧
public class Claim
{
  public string ClaimType { get; set; }

  public string ClaimValue { get; set; }
}

ClaimType 就是Key,ClaimValue就代表一個Value。這樣的話,剛好可以存儲一個鍵值對。這時候姓名:奧巴馬是不是可以存進去了。

微軟的人很貼心,給我們準備了一些默認的ClaimType呢?很多常用的都在里面呢,一起看看吧:

這里延伸第一個知識點:ClaimTypes

 如何入門ASP.NETCore中的Identity

為了閱讀體驗,截圖我只放了一部分哦。可以看到有什么Name,Email,Gender,MobilePhone等常用的都已經有了,其他的還有很多。細心的讀者可能注意了,它的命名空間是System.Security.Claims,那就說明這個東西是.net 框架的一部分,嗯,我們暫時只需要知道這么多就OK了。

Claim 介紹完畢,是不是很簡單,其他地方怎么翻譯我不管,在本篇文章里面,它叫 “證件單元”。

# 2: ClaimsIdentity

在有了“證件單元”之后,我們就用它可以制造一張身份證了,那么應該怎么樣制造呢?有些同學可能已經想到了,對,就是新建一個對象,然后在構造函數里面把身份證單元傳輸進去,然后就得到一張身份證了。我們給這張身份證取一個英文名字叫 “ClaimsIdentity”,這個名字看起來還蠻符合的,既有 Claims 表示其組成部分,又有表示其用途的 Identity(身份),很滿意的一個名字。

實際上,在現實生活中,我們的身份證有一部分信息是隱藏的,有一部分是可以直接看到的。比如新一代的身份證里面存儲了你的指紋信息你是看不到的,這些都存儲在身份證里面的芯片中,那能看到的比如姓名啊,年齡啊等。我們在設計一個對象的時候也是一樣,需要暴露出來一些東西,那這里我們的 ClaimsIdentity 就暴露出來一個 Name,Lable等。

我們造的身份證(ClaimsIdentity)還有一個重要的屬性就是類型(AuthenticationType),等等,AuthenticationType是什么東西?看起來有點眼熟的樣子。我們知道我們自己的身份證是干嘛的吧,就是用來證明我們的身份的,在你證明身份出示它的時候,其實它有很多種形式載體的,什么意思呢?比如你可以直接拿出實體形式的身份證,那也可以是紙張形式的復印件,也可以是電子形式的電子碼等等,這個時候就需要有一個能夠表示其存在形式的類型字段,對,這個AuthenticationType就是干這個事情的。

然后我們在給我們的身份證添加一些潤色,讓其看起來好看,比如提供一些方法添加 Claims 的,刪除 Claims的,寫到二進制流里面的啊等等,最終我們的身份證對象看起來基本上是這樣了:

public class ClaimsIdentity
{
  public ClaimsIdentity(IEnumerable<Claim> claims){}
  
  //名字這么重要,當然不能讓別人隨便改啊,所以我不許 set,除了我兒子跟我姓,所以是 virtual 的
  public virtual string Name { get; }
  public string Label { get; set; }
  
  //這是我的證件類型,也很重要,同樣不許 set
  public virtual string AuthenticationType { get; }
  
  public virtual void AddClaim(Claim claim);
  
  public virtual void RemoveClaim(Claim claim);
  
  public virtual void FindClaim(Claim claim);
}

嗯,到這里,我們的身份證看起來似乎很完美了,但是從面向對象的角度來說好像還少了點什么東西? 對~,還是抽象,我們需要抽象出來一個接口來進行一些約束,約束什么呢?既然作為一個證件,那么肯定會涉及到這幾個屬性信息:

1、名字。2、類型。3、證件是否合法。

反應到接口里面的話就是如下,我們給接口取個名字叫:“身份(IIdentity)”:

這里延伸第二個知識點:IIdentity接口。

// 定義證件對象的基本功能。
public interface IIdentity
{
  //證件名稱
  string Name { get; }
  
  // 用于標識證件的載體類型。
  string AuthenticationType { get; }
  
  //是否是合法的證件。
  bool IsAuthenticated { get; }
}

所以我們的 ClaimsIdentity 最終看起來定義就是這樣的了:

public class ClaimsIdentity : IIdentity
{
  //......
}

ClaimsIdentity 介紹完畢,是不是發現也很簡單,其他地方怎么翻譯我不管,在本篇文章里面,它叫 “身份證”。

# 3: ClaimsPrincipal

有了身份證,我們就能證明我就是我了,有些時候一個人有很多張身份證,你猜這個人是干嘛的? 對,不是黃牛就是詐騙犯。

但是,有些時候一個人還有其他很多種身份,你猜這個人是干嘛的?這就很正常了對不對,比如你可以同時是一名教師,母親,商人。如果你想證明你同時有這幾種身份的時候,你可能需要出示教師證,你孩子的出生證,法人代表的營業執照證。

在程序中,一個身份證不僅僅代表你這個人了,而是代表一個身份,是證明你自己的主要身份哦。如果一個人還有其他很多種身份,這個時候就需要有一個東西(載體)來攜帶著這些證件了對吧?OK,我們給需要攜帶證件的這個對象取一個貼切點的名字,叫“證件當事人(ClaimsPrincipal)”吧。

以下是 Principal 這個單詞在詞典給出的解釋,我用它你應該沒意見吧:

principal  ['pr?ns?pl] 

adj. 主要的;資本的

n. 首長;校長;資本;當事人

這個時候可能有同學會問了,是不是應該叫ClaimsIdentityPrincipal比較好呢?嗯,我也覺得應該叫 ClaimsIdentityPrincipal 可能更好一點,或許微軟的人偷懶了,簡寫成了ClaimsPrincipal

知道其功能后,代碼就很好寫了,和上面ClaimsIdentity一樣的套路:

public class ClaimsPrincipal 
{
  //把擁有的證件都給當事人
  public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities){}
  
  //當事人的主身份呢
  public virtual IIdentity Identity { get; }
  
  public virtual IEnumerable<ClaimsIdentity> Identities { get; }
  
  public virtual void AddIdentity(ClaimsIdentity identity);
  
  //為什么沒有RemoveIdentity , 留給大家思考吧?
}

)。

這里延伸第三個知識點:IPrincipal 接口。

public interface IPrincipal
{
  //身份
  IIdentity Identity { get; }
  
  //在否屬于某個角色
  bool IsInRole(string role);
}

然后,我們的 證件當事人 看起來應該是這樣的:

public class ClaimsPrincipal : IPrincipal 
{
  //...
}

ClaimsPrincipal 介紹完了,也很簡單吧? 其他地方怎么翻譯我不管,在本篇文章里面,它叫 “證件當事人”。

想在,我們已經知道了 “證件單元(Claims)” , “身份證(ClaimsIdentity)” , “證件當事人(ClaimsPrincipal)”,并且整理清楚了他們之間的邏輯關系,趁熱打鐵,下面這個圖是一個identity登入部分的不完全示意圖,虛線圈出來的部分應該可以看懂了吧:

 如何入門ASP.NETCore中的Identity

可以看出,首先我們在app這邊有一些證件單元,然后調用ClaimsIdentity把證件單元初始化為一個身份證,然后再把身份證交給證件當事人由其保管。

才把 Getting Started 寫完,發現已經這么長了,所以打算寫成一個系列了,可能3 - 4篇吧。

關于如何入門ASP.NETCore中的Identity 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鞍山市| 南澳县| 綦江县| 绥滨县| 长宁区| 浏阳市| 崇明县| 丰台区| 鹿邑县| 砀山县| 申扎县| 金溪县| 麟游县| 伊川县| 冕宁县| 阿合奇县| 华安县| 丽江市| 阿鲁科尔沁旗| 大关县| 铜梁县| 上犹县| 浦县| 图木舒克市| 嘉荫县| 海门市| 桓台县| 万源市| 兴国县| 炎陵县| 炉霍县| 阿勒泰市| 从江县| 仁化县| 临西县| 勐海县| 华安县| 滦南县| 安乡县| 松潘县| 晋江市|