ASP.NET Core에서는 사용자의 신원을 인증하는 ASP.NET의 Identity 구성 요소 라이브러리가 여전히 사용됩니다. 🎜>MVC 5는 너무 복잡합니다. MVC 5에 OWIN이 도입되었기 때문에 많은 초보자들이 ID에 대해 혼란스러워합니다. 저는 한 번 이상 ID에 대해 배웠습니다. 내부의 원리를 이해합니다. 따라서 대부분의 개발자는 Identity를 좋아하지 않으며 사용하지도 않습니다.
다행히 ASP.NET Core에서는 모듈의 추상화가 점차 명확해지고미들웨어의 사용으로 인해 Identity의 학습 및 사용 경로가 더욱 복잡해집니다. 살펴보자.
시작하기시작하기 전에와의 관계, Entity Framework
와의 관계를 먼저 잊어봅시다. Authentication
단어"가 너무 많아서 알아내야 할 수도 있습니다.
# 1: 주장
모두 신분증이 어떻게 생겼는지 아시나요? 그 중이름: 오바마 성별: 남자; ; 국적: 케냐; 생년: 1961.08.04 등. 이러한 신원 정보는 모두 키-값 쌍임을 알 수 있습니다. , 그렇다면 이러한 것들을 어떻게 저장하고 디자인할까요? 예, 저장을 위해 사전을 사용하는 것을 생각해 보셨을 것입니다. 키와 값은 필요에 딱 맞습니다. 하지만 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 등 자주 사용하는 것들이 이미 있고 그 외에도 많이 있는 것을 볼 수 있습니다. 주의 깊은 독자라면 네임스페이스 가 라는 사실을 알아차렸을 것입니다. 이는 이것이 .net System.Security.Claims
프레임워크 의 일부라는 것을 의미합니다. 글쎄, 그게 우리가 당분간 알아야 할 전부입니다. . 좋아요.
소개가 완료되었습니다. 아주 간단하지 않나요? 다른 곳에서는 어떻게 번역해도 상관없습니다. “인증서 단위”.
# 2: ClaimsIdentity
"인증서 단위"를 확보한 후 이를 사용하여 ID 카드를 생성할 수 있으며, 어떻게 해야 합니까? 만들어질까? 어떤 학생들은 '그래, 그냥 새 객체를 만든 다음 ID 카드 단위를 생성자 에 전달하면 ID 카드를 얻을 수 있다'고 생각했을 수도 있습니다. 이 ID 카드에는 "ClaimsIdentity"라는 이름이 붙었습니다. 구성 요소를 나타내는 Claims와 목적을 나타내는 Identity가 모두 포함되어 있어 매우 만족스러운 이름입니다.
실제로 우리 신분증의 정보 중 일부는 숨겨져 있고 일부는 직접 볼 수 있습니다. 예를 들어, 차세대 신분증에 저장된 지문 정보는 모두 신분증 내부 칩에 저장되어 있으므로 볼 수 없습니다. 객체를 디자인할 때도 마찬가지입니다. 따라서 여기서는 ClaimsIdentity가 이름, 레이블 등을 노출합니다.我们造的身份证(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登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:
可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity
把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。
才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。
미들웨어의 세부 사항을 벗겨보겠습니다. Identiy와 Entity를 살펴보세요. Framework에는 어떤 사랑/증오 관계가 있습니까?이 블로그가 도움이 되셨다면 [추천]을 눌러주세요. .NET Core에 대한 정보를 정기적으로 공유하겠습니다. .NET Core 학습 경험에 대해 알아보세요.
위 내용은 ASP.NET Core에서 ID 시작하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!