Heim  >  Artikel  >  Backend-Entwicklung  >  Erste Schritte mit Identität in ASP.NET Core

Erste Schritte mit Identität in ASP.NET Core

PHPz
PHPzOriginal
2017-03-12 16:30:491814Durchsuche

Vorwort

In ASP.NET Core wird weiterhin die Identitätskomponentenbibliothek in ASP.NET verwendet, die für die Authentifizierung der Benutzeridentität verantwortlich ist. Im Allgemeinen gibt es keineMVC 5 ist so kompliziert, dass es vielen Anfängern schwerfällt, es zu lernen, auch ich habe mehr als einen Monat gebraucht um die darin enthaltenen Prinzipien zu verstehen. Daher haben die meisten Entwickler keine Vorliebe für Identität und nutzen sie nicht. Sie fühlen sich entführt.

Glücklicherweise wird in ASP.NET Core aufgrund der allmählich klaren Abstraktion von Modulen und der Verwendung von Middleware der Lern- und Verwendungsweg der Identität komplizierter. Werfen wir einen Blick darauf.

Erste Schritte

Bevor wir beginnen, vergessen wir die Beziehung zu Entity Framework und die Beziehung zu Authentication. Lernen wir zunächst ein paar englische Wörter.

Es gibt so viele „Wörter“, die Sie möglicherweise herausfinden müssen:

# 1: Ansprüche

Jeder Sollten Sie wissen, wie der Personalausweis wie folgt aussieht:

Erste Schritte mit Identität in ASP.NET Core

Darunter Name: Obama; Geschlecht: Männlich ; Nationalität : Kenia; Geburt: 1961.08.04 usw. Aus diesen Identitätsinformationen ist ersichtlich, dass es sich bei allen um Schlüssel-Wert-Paare handelt , wenn wir dann wollen, wie man diese Dinge speichert und gestaltet? Ja, Sie haben vielleicht darüber nachgedacht, ein Wörterbuch zur Speicherung zu verwenden, ein Schlüssel und ein Wert erfüllen genau Ihre Anforderungen. Aber Key und Value wirken unfreundlich und nicht sehr objektorientiert. Wäre es also nicht besser, wenn wir daraus ein Objekt machen würden? Zumindest können Sie die intelligente Eingabeaufforderung von vs verwenden. Lassen Sie es uns ändern und wie folgt ändern:

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

    public string ClaimValue { get; set; }
}

ClaimType ist Key und ClaimValue stellt einen Wert dar. In diesem Fall kann nur ein Schlüssel-Wert-Paar gespeichert werden. Kann ich es zu diesem Zeitpunkt 姓名:奥巴马 einzahlen?

Die Leute bei Microsoft sind sehr rücksichtsvoll und haben einige Standardvorgaben ClaimType für uns vorbereitet? Viele häufig verwendete sind darin enthalten, werfen wir einen Blick darauf:

Hier erweitern wir den ersten Wissenspunkt: ClaimTypes

Erste Schritte mit Identität in ASP.NET Core

Für Leseerfahrung: Ich habe nur einen Teil des Screenshots eingefügt. Sie können sehen, welcher Name, E-Mail, GEndeer, Mobiltelefon und andere häufig verwendete Namen bereits vorhanden sind, und es gibt noch viele andere. Aufmerksame Leser haben vielleicht bemerkt, dass sein Namespace System.Security.Claims ist, was bedeutet, dass dieses Ding Teil des .net Frameworks ist. Nun, das ist alles, was wir vorerst wissen müssen . OK.

Claim Einführung Ist es nicht ganz einfach? Es ist mir egal, wie es an anderen Stellen übersetzt wird, es heißt „Zertifikatseinheit“. “.

# 2: ClaimsIdentity

Nachdem wir die „Dokumenteneinheit“ haben, können wir damit einen Ausweis erstellen, dann Wie soll es sein gemacht werden? Einige Schüler haben vielleicht gedacht: Ja, erstellen Sie einfach ein neues Objekt und übertragen Sie dann die Ausweiseinheit in den Konstruktor , und dann erhalten Sie einen Ausweis. Wir geben diesem Ausweis einen englischen Namen: „ClaimsIdentity“. ​​Dieser Name scheint sowohl für die Darstellung seiner Bestandteile als auch für die Identität geeignet.

Tatsächlich ist im wirklichen Leben ein Teil der Informationen auf unseren Ausweisen verborgen und ein Teil davon direkt sichtbar. Beispielsweise können Sie Ihre in der neuen Generation von Ausweisen gespeicherten Fingerabdruckinformationen nicht sehen. Diese sind alle im Chip im Ausweis gespeichert. Sie können jedoch Ihren Namen, Ihr Alter usw. sehen. Dasselbe gilt, wenn wir ein Objekt entwerfen. Wir müssen etwas offenlegen, also legt unsere ClaimsIdentity hier einen Namen, eine Bezeichnung usw. offen.

我们造的身份证(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登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:

Erste Schritte mit Identität in ASP.NET Core

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

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

Zusammenfassung

Okay, dieser Artikel wird hier zuerst vorgestellt. In diesem Blog haben wir ein paar englische Wörter gelernt und wissen, was für ein Objekt es ist es spielt im Programm? Und der Abbildung zufolge wissen wir, wo sich diese Objekte im gesamten Authentifizierungssystem befinden. Ich habe festgestellt, dass dieser Blog allein nicht ausreicht, um die Details der .NET Authentication Middleware zu erläutern, bis wir das gesamte Authentifizierungssystem von .NET beherrschen Werfen Sie einen Blick auf Identiy und Entity. Was für eine Hassliebe es zwischen Framework gibt.

Dies ist nur der Anfang. Vielen Dank für Ihre [Empfehlung]. Wenn Sie sich für .NET Core interessieren, werde ich regelmäßig Informationen darüber teilen es auf dem Blog. .NET Core-Lernerfahrung.

Das obige ist der detaillierte Inhalt vonErste Schritte mit Identität in ASP.NET Core. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn