ASP.NET Core では、ASP.NET の Identity コンポーネント ライブラリが引き続き使用されており、これはユーザーの ID を認証する役割を果たします。一般的に、MVC 5 ほど複雑ではありません。 MVC OWIN は 5 で導入されたため、多くの初心者は学習に苦労し、Identity について混乱しています。私もその 1 つで、Identity の内部原理を理解するのに前後 1 か月以上費やしたことがあります。したがって、ほとんどの開発者は Identity に愛情を持っておらず、誘拐されたように感じています。
ありがたいことに、ASP.NET Core では、モジュールの抽象化と ミドルウェア の使用により、Identity の学習と使用ルートがよりわかりやすくなりました。一緒に見てみましょう。
始める前に、Entity Framework
との関係、および Authentication
との関係を忘れてみましょう。まず、いくつかの英単語を学びましょう。 Entity Framework
的关系,也忘记它和Authentication
的关系,我们先学习几个英语单词。
有这么几个“单词”你可能需要弄明白:
# 1: Claims
大家应该都知道身份证长什么样子的,如下:
其中,姓名:奥巴马;性别:男;民族:肯尼亚;出生: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
为了阅读体验,截图我只放了一部分哦。可以看到有什么Name,Email,Gender,MobilePhone等常用的都已经有了,其他的还有很多。细心的读者可能注意了,它的命名空间是System.Security.Claims
理解する必要がある「単語
その中で、
名前: オバマ; 性別: 男性; 民族: ケニア; birth
: 1961.08.04 など。これらの ID 情報はすべてキーと値のペアであることがわかります。では、これらをプログラムに格納したい場合、どのように設計すればよいでしょうか。はい、ストレージ用の辞書、キー、および値を満たすものを使用することを考えたことがあるかもしれません。ニーズ。しかし、Key と Value はあまりユーザーフレンドリーではなく、オブジェクト指向的ではないので、これを対象だったら、その方が良いんじゃないでしょうか?少なくとも vs のスマート プロンプトを使用できます。これを修正して次のように変更しましょう:
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); }
名前: オバマ
を保存できますか? 🎜🎜Microsoft の人々は非常に思いやりがあり、デフォルトの ClaimType
をいくつか用意してくれました。よく使用される多くのものが含まれています。見てみましょう: 🎜🎜これは最初の知識ポイントの拡張です: ClaimTypes🎜🎜🎜🎜読書体験のために、スクリーンショットの一部のみを含めました。名前、メール🎜、Gend🎜er、MobilePhone、その他の一般的に使用されるものはすでに利用可能であり、他にもたくさんあります。注意深い読者は、その 名前空間 🎜 が
System.Security.Claims code> であることに気づいたかもしれません。つまり、これは .net 🎜framework🎜 の一部であるということです。当面はこれだけ知っておく必要があります。 🎜🎜はじめに🎜の説明は完了しました。他の場所でどのように翻訳されているかは気にしません。この記事では「🎜証明書ユニット🎜」と呼ばれています。 🎜🎜🎜# 2: ClaimsIdentity🎜🎜🎜「🎜Certificate Unit🎜」を取得したら、それを使用して ID カードを作成できますが、どのように作成すればよいでしょうか?生徒の中には、「はい、新しいオブジェクトを作成して、ID カード ユニットを 🎜コンストラクター🎜 に転送するだけで、ID カードが取得できる」と考えた人もいるかもしれません。この ID カードに「🎜ClaimsIdentity🎜」という英語名を付けました。この名前は、そのコンポーネントを表す Claim と、その目的を表す Identity の両方を備えています。 🎜🎜実際、実生活では、IDカードの情報の一部は隠されており、一部は直接見ることができます。たとえば、新世代の ID カードには、目に見えない指紋情報が保存されています。これらはすべて、ID カード内のチップに保存されています。オブジェクトを設計するときにも同様であり、何かを公開する必要があるため、ここでは ClaimsIdentity が名前、ラベルなどを公開します。 🎜<p>我们造的身份证(ClaimsIdentity)还有一个重要的<a href="http://www.php.cn/wiki/169.html" target="_blank">属性</a>就是类型(AuthenticationType),等等,AuthenticationType是什么东西?看起来有点眼熟的样子。我们知道我们自己的身份证是干嘛的吧,就是用来证明我们的身份的,在你证明身份出示它的时候,其实它有很多种形式载体的,什么意思呢?比如你可以直接拿出实体形式的身份证,那也可以是纸张形式的复印件,也可以是电子形式的电子码等等,这个时候就需要有一个能够表示其存在形式的类型字段,对,这个AuthenticationType就是干这个事情的。</p>
<p>然后我们在给我们的身份证添加一些润色,让其看起来好看,比如提供一些方法添加 Claims 的,<a href="http://www.php.cn/php/php-tp-remove.html" target="_blank">删除</a> Claims的,写到二进制流里面的啊等等,最终我们的身份证对象看起来基本上是这样了:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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);
}</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div>
<p>嗯,到这里,我们的<strong>身份证</strong>看起来似乎很完美了,但是从面向对象的角度来说好像还少了点什么东西? 对~,还是抽象,我们需要抽象出来一个<a href="http://www.php.cn/code/11829.html" target="_blank">接口</a>来进行一些<a href="http://www.php.cn/code/12132.html" target="_blank">约束</a>,约束什么呢?既然作为一个证件,那么肯定会涉及到这几个属性信息:<br>1、名字。2、类型。3、证件是否合法。<br>反应到接口里面的话就是如下,我们给接口取个名字叫:“<strong>身份(IIdentity)</strong>”:</p>
<blockquote><p>这里延伸第二个知识点:IIdentity接口。</p></blockquote>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 定义证件对象的基本功能。
public interface IIdentity
{
//证件名称
string Name { get; }
// 用于标识证件的载体类型。
string AuthenticationType { get; }
//是否是合法的证件。
bool IsAuthenticated { get; }
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
<p>所以我们的 ClaimsIdentity 最终看起来定义就是这样的了:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public class ClaimsIdentity : IIdentity
{
//......
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
<p>ClaimsIdentity 介绍完毕,是不是发现也很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “<strong>身份证</strong>”。</p>
<p><strong># 3: ClaimsPrincipal</strong></p>
<p>有了身份证,我们就能证明我就是我了,有些时候一个人有很多张身份证,你猜这个人是干嘛的? 对,不是黄牛就是诈骗犯。</p>
<p>但是,有些时候一个人还有其他很多种身份,你猜这个人是干嘛的?这就很正常了对不对,比如你可以同时是一名教师,母亲,商人。如果你想证明你同时有这几种身份的时候,你可能需要出示教师证,你孩子的出生证,法人代表的营业执照证。</p>
<p>在程序中,一个身份证不仅仅代表你这个人了,而是代表一个身份,是证明你自己的主要身份哦。如果一个人还有其他很多种身份,这个时候就需要有一个东西(载体)来携带着这些证件了对吧?OK,我们给需要携带证件的这个对象取一个贴切点的名字,叫“<strong>证件当事人(ClaimsPrincipal)</strong>”吧。</p>
<blockquote>
<p>以下是 Principal 这个单词在词典给出的解释,我用它你应该没意见吧:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">principal ['prɪnsəpl]
adj. 主要的;资本的
n. 首长;校长;资本;当事人</pre><div class="contentsignin">ログイン後にコピー</div></div>
</blockquote>
<p>这个时候可能有同学会问了,是不是应该叫<code>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登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:
可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity
把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。
才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。
さて、このブログでは最初にこの記事を紹介します。私たちはいくつかの英単語を学び、それらの英単語がプログラム内でどのようなオブジェクトを演じるのかを知りました。そして、図によれば、これらのオブジェクトが認証システム全体のどこにあるかがわかります。 ID を明確に説明したい場合は、このブログだけでは不十分であることがわかりました。次の記事では、.NET の認証システム全体を習得するまでミドルウェアを取り上げます。Identiy がどのように関係するかを見てみましょう。 Entity Framework なんて愛憎なんだろう。 .NET Authentication
以上がASP.NET Core での ID の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。