>  기사  >  백엔드 개발  >  ASP.NET Core에서 ID 시작하기

ASP.NET Core에서 ID 시작하기

PHPz
PHPz원래의
2017-03-12 16:30:491814검색

머리말

ASP.NET Core에서는 사용자의 신원을 인증하는 ASP.NET의 Identity 구성 요소 라이브러리가 여전히 사용됩니다. 🎜>MVC 5는 너무 복잡합니다. MVC 5에 OWIN이 도입되었기 때문에 많은 초보자들이 ID에 대해 혼란스러워합니다. 저는 한 번 이상 ID에 대해 배웠습니다. 내부의 원리를 이해합니다. 따라서 대부분의 개발자는 Identity를 좋아하지 않으며 사용하지도 않습니다.

다행히 ASP.NET Core에서는 모듈의 추상화가 점차 명확해지고

미들웨어의 사용으로 인해 Identity의 학습 및 사용 경로가 더욱 복잡해집니다. 살펴보자.

시작하기

시작하기 전에

와의 관계, Entity Framework와의 관계를 먼저 잊어봅시다. Authentication

"

단어"가 너무 많아서 알아내야 할 수도 있습니다.

# 1: 주장

모두 신분증이 어떻게 생겼는지 아시나요?

ASP.NET Core에서 ID 시작하기

그 중

이름: 오바마 성별: 남자; ; 국적: 케냐; 생년: 1961.08.04 등. 이러한 신원 정보는 모두 키-값 쌍임을 알 수 있습니다. , 그렇다면 이러한 것들을 어떻게 저장하고 디자인할까요? 예, 저장을 위해 사전을 사용하는 것을 생각해 보셨을 것입니다. 와 값은 필요에 딱 맞습니다. 하지만 Key와 Value는 객체지향도 아닌 불친절한 느낌이 들기 때문에 객체로 만드는 것이 더 좋지 않을까요? 최소한 vs의 스마트 프롬프트를 사용할 수 있습니다. 이를 수정하여 다음과 같이 변경해 보겠습니다.

//我给对象取一个名字叫`Claim`你没有意见吧
public class Claim
{
    public string ClaimType { get; set; }

    public string ClaimValue { get; set; }
}
ClaimType은 Key이고 ClaimValue는 Value를 나타냅니다. 이 경우

키-값 쌍을 저장할 수 있습니다. 이때 입금해도 되나요? 姓名:奥巴马

Microsoft 직원들은 매우 배려심이 깊어 우리를 위해 몇 가지 기본

을 준비했습니다. 일반적으로 사용되는 많은 것들이 여기에 있습니다. 살펴보겠습니다: ClaimType

여기서 첫 번째 지식 포인트를 확장합니다: ClaimTypes

ASP.NET Core에서 ID 시작하기

읽어본 경험상 스크린샷의 일부만 포함시켰습니다. 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登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:

ASP.NET Core에서 ID 시작하기

可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。

才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。

미들웨어의 세부 사항을 벗겨보겠습니다. Identiy와 Entity를 살펴보세요. Framework에는 어떤 사랑/증오 관계가 있습니까?

이 블로그가 도움이 되셨다면 [추천]을 눌러주세요. .NET Core에 대한 정보를 정기적으로 공유하겠습니다. .NET Core 학습 경험에 대해 알아보세요.

위 내용은 ASP.NET Core에서 ID 시작하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.