欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

allbet开户:【asp.net core 系列】15 自定义Identity

admin2020-07-0945

0. 前言

在之前的文章中简朴先容了一下asp.net core中的Identity,这篇文章将继续针对Identity举行进一步的睁开。

1. 给Identity添加分外的信息

在《【asp.net core 系列】13 Identity 身份验证入门》一文中,我们也许领会了若何使用Identity,以及若何保留一些信息以便后续的验证。这里我们将深入讨论一下若何给Identity添加更多的信息。

我们知道在给Identity添加数据的时刻,需要添加一个Claim工具。我们先回首一下Claim的信息,Claim的属性大多只提供了公然的get接见器,以是这个类的重点在于组织方式:

public class Claim
{
    // 基础的
    public Claim(string type, string value);
    public Claim(string type, string value, string valueType);
    public Claim(string type, string value, string valueType, string issuer);
    public Claim(string type, string value, string valueType, string issuer, string originalIssuer);
    //
    public Claim(BinaryReader reader);
    public Claim(BinaryReader reader, ClaimsIdentity subject);
}

暂且看一下几个使用字符类型的组织函数参数:

  1. type Claim的类型,支持自界说,但asp.net core 提供了一个基础的类型界说:
public static class ClaimTypes
{
    // 隐藏其他属性
    public const string Name = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";
    public const string Role = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role";
}

​ 这个类里界说了大多数情况下会用到的Claims的类型。

  1. value 存放Claim的值,通常情况下纰谬这个值举行约束

  2. valueType 示意 value的类型,取值局限参考类:

    public static class ClaimValueTypes
    {
        public const string Base64Binary = "http://www.w3.org/2001/XMLSchema#base64Binary";
        public const string UpnName = "http://schemas.xmlsoap.org/claims/UPN";
        public const string UpnName = "http://schemas.xmlsoap.org/claims/UPN";
     	public const string UInteger32 = "http://www.w3.org/2001/XMLSchema#uinteger32";
        public const string Time = "http://www.w3.org/2001/XMLSchema#time";
        public const string String = "http://www.w3.org/2001/XMLSchema#string";
        public const string Sid = "http://www.w3.org/2001/XMLSchema#sid";
        public const string RsaKeyValue = "http://www.w3.org/2000/09/xmldsig#RSAKeyValue";
        public const string Rsa = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa";
        public const string Rfc822Name = "urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name";
        public const string KeyInfo = "http://www.w3.org/2000/09/xmldsig#KeyInfo";
        public const string Integer64 = "http://www.w3.org/2001/XMLSchema#integer64";
        public const string X500Name = "urn:oasis:names:tc:xacml:1.0:data-type:x500Name";
        public const string Integer32 = "http://www.w3.org/2001/XMLSchema#integer32";
        public const string HexBinary = "http://www.w3.org/2001/XMLSchema#hexBinary";
        public const string Fqbn = "http://www.w3.org/2001/XMLSchema#fqbn";
        public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
        public const string DsaKeyValue = "http://www.w3.org/2000/09/xmldsig#DSAKeyValue";
        public const string Double = "http://www.w3.org/2001/XMLSchema#double";
        public const string DnsName = "http://schemas.xmlsoap.org/claims/dns";
        public const string DaytimeDuration = "http://www.w3.org/TR/2002/WD-xquery-operators-20020816#dayTimeDuration";
        public const string DateTime = "http://www.w3.org/2001/XMLSchema#dateTime";
        public const string Date = "http://www.w3.org/2001/XMLSchema#date";
        public const string Boolean = "http://www.w3.org/2001/XMLSchema#boolean";
        public const string Base64Octet = "http://www.w3.org/2001/XMLSchema#base64Octet";
        public const string Integer = "http://www.w3.org/2001/XMLSchema#integer";
        public const string YearMonthDuration = "http://www.w3.org/TR/2002/WD-xquery-operators-20020816#yearMonthDuration";
    }
    
  3. issuer 用来存放 Claim的发布者,默认值是:ClaimsIdentity.DefaultIssuer 该值允许在组织函数是传NULL,一旦传NULL,则自动以为是ClaimsIdentity.DefaultIssuer

  4. originalIssuer Claim的原发布人,若是不给值,则默认与issuer一致。

这是从组织函数以及相关文档中获取到的。

关于ClaimTypes里我只贴了两个,原因是这两个值在Claim中是两个必不可少的值。凭据属性名就能看出来,一个是设置用户的名称,一个是设置用户的角色。

那么,继续探索Claim里的属性和方式:

public class Claim
{
    public string Type { get; }
    public ClaimsIdentity Subject { get; }
    public IDictionary<string, string> Properties { get; }
    public string OriginalIssuer { get; }
    public string Issuer { get; }
    public string ValueType { get; }
    public string Value { get; }
    public virtual Claim Clone();
    public virtual Claim Clone(ClaimsIdentity identity);
    public virtual void WriteTo(BinaryWriter writer);
}

几个基本属性都是从组织函数中获取的,这里就不做过多的先容了。不外值得注重的一点是,Properties这个属性的值获取是需要使用

public Claim(BinaryReader reader, ClaimsIdentity? subject)

这个组织方式才可以有用的对其举行赋值,以是这个属性并没有太多值得关注的地方。

先容完了Claim类之后,我们继续看一下Identity相关的常用类:

public class ClaimsIdentity : IIdentity;

通过这个类的声明,我们可以看出它实现了接口:

public interface IIdentity
{
    string? AuthenticationType { get; }
    bool IsAuthenticated { get; }
    string? Name { get; }
}

其中

  • AuthenticationType 示意验证类型
  • IsAuthenticated 示意是否验证通过
  • Name 存放的用户名

这是Identity里最要害的三个属性,贯穿着整个Identity系统。我们继续看一下ClaimsIdentity的几个要害点:

public class ClaimsIdentity : IIdentity
{
    public ClaimsIdentity(string authenticationType);
    public ClaimsIdentity(IIdentity identity);
    public ClaimsIdentity(IEnumerable<Claim> claims);
    public ClaimsIdentity(IEnumerable<Claim> claims, string authenticationType);
    public ClaimsIdentity(IIdentity identity, IEnumerable<Claim> claims);
    public virtual void AddClaim(Claim claim);
    public virtual void AddClaims(IEnumerable<Claim> claims);
}

对于ClaimsIdentity而言,其核心内容是Claim实例。我们通常需要组织Claim工具,在Claim工具中添加我们想添加的值,然后装入ClaimIdentity中。这里有一个值需要分外注重一下:AuthenticationType 示意验证类型,值并没有分外要求,不外对于使用Cookie作为信息保留的话,需要设置值为:

CookieAuthenticationDefaults.AuthenticationScheme

这时刻,我们已经获得了一个Identity工具,在asp.net core 中 Identity系统另有最后一个要害类:

public class ClaimsPrincipal : IPrincipal
{
    public ClaimsPrincipal();
    public ClaimsPrincipal(IIdentity identity);
    public ClaimsPrincipal(IPrincipal principal);
    public virtual void AddIdentities(IEnumerable<ClaimsIdentity> identities);
    public virtual void AddIdentity(ClaimsIdentity identity);
}

这个类提供了几个方式用来存储Identity,这个类在IPrincipal基础上以Identity为基础数据。这一点可以通过组织函数和它提供的一些方式可以确认。

2. 读取Identity的信息

在第一小节中,我简朴先容了一下若何行使Claim和ClaimsIdentity以及ClaimsPrincipal这三个类来存储用户信息以及我们想要的数据。这里我们看一下若何通过Principal读取信息,以及简朴剖析一下背后的逻辑。

我们使用HttpContext的扩展方式:

public static Task SignInAsync(this HttpContext context, ClaimsPrincipal principal);

将我们设置的principal数据保留,所保留的地方取决于我们在Startup.cs中的设置。在该系列中,我们启用了Cookie,以是这个信息会以Cookie的形式保留。

在控制器内部时,Controller类为我们提供了一个属性:

public ClaimsPrincipal User { get; }

通过这个属性可以反向获取到我们保留的Principal实例。

接下来,让我们反向解析出Principal内里的数据:

public interface IPrincipal
{
    IIdentity? Identity { get; }
    bool IsInRole(string role);
}

IPrincipal提供了两个基础数据和方式,一个是获取一个Identity工具,一个是判断是否是某个角色。

2.1 Identity

在ClaimPrincipal中,Identity属性的默认取值逻辑是:

if (identities == null)
{
    throw new ArgumentNullException(nameof(identities));
}

foreach (ClaimsIdentity identity in identities)
{
    if (identity != null)
    {
        return identity;
    }
}

return null;

也就是获取Principal中第一个不为Null的Identity工具,这个取值逻辑可以通过下面的属性举行修改:

public static Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity?> PrimaryIdentitySelector { get; set; }

2.2 IsInRole

在Principal中,通常会存放一至多个Identity工具,每个 Identity工具有一至多个Claim工具。当有Claim工具的Type 值与Identity工具的:

public string RoleClaimType { get; }

值一致时,就会被以为该Claim内里存放着角色信息,这时刻会通过传入的role值与Claim的Value举行对照。

对照的方式是Identity的实例方式HasClaim:

public virtual bool HasClaim(string type, string value);

若是初始化Identity时,没有手动设置roleType参数,那么这个参数取值就是:

public const string DefaultRoleClaimType = ClaimTypes.Role;

通常情况下,不会单独设置roleType。

2.3 IsAuthenticated 判断是否登录

这个属性并不是ClaimPrincipal的,而是ClaimIdentity的。通常在asp.net core 中会使用这个属性判断接见者是否完成了身份校验。这个属性的判断逻辑也很简朴:

public virtual bool IsAuthenticated
{
    get { return !string.IsNullOrEmpty(AuthenticationType); }
}

也就是说,在Identity中指定了AuthenticationType就会以为完成了身份校验。

通常的使用方式:

User.Identity.IsAuthenticated

通过以上挪用链举行数据挪用。

2.4 Name

与IsAuthenticatedy一样,这个属性也是ClaimIdentity的。与IsInRole的判断依据类似,这个属性会获取Identity中存放的Claim聚集中第一个RoleType为ClaimType.Name的Claim,然后取值。

以是,在实现登录的时刻,若是想要能够通过:

User.Identity.Name

获取一个用户名信息或者其他名称信息的话,则需要设置一个Type即是:

public const string DefaultNameClaimType = ClaimTypes.Name;

的Claim实例工具。

2.5 获取Claim

在Principal系统中,最主要也是最基础的数据就是Claim工具。对于ClaimPrincipal工具来说,内里必然会存放多个Claim工具。那么,我们就需要有操作Claim工具的方式:

public virtual IEnumerable<Claim> Claims { get; }

通过这个方式可以获得ClaimPrincipal里所有的Claim工具,这是一个迭代器工具。

public virtual IEnumerable<Claim> FindAll(Predicate<Claim> match);

通过一个选择器筛选出相符条件的Claim聚集。

public virtual IEnumerable<Claim> FindAll(string type);

查询所有相符类型的Claim工具。

public virtual Claim FindFirst(string type);

查找第一个Type值与指定值相同的Claim工具。

public virtual bool HasClaim(Predicate<Claim> match);

查询是否存在相符条件的Claim工具。

public virtual bool HasClaim(string type, string value);

查询是否有Type和Value属性均即是指定值的Claim工具。

这些方式都是ClaimPrincipal里的,相对应的ClaimIdentity里也提供了类似的方式这里就不做先容了。

3. 总结

这一章先容了若何行使Claim举行用户信息保留,以及通例的一些使用逻辑。下一章,我们将继续探索若何行使我们自己设置的Identity以到达我们的目的。

更多内容烦请关注我的博客《高先生小屋》

,

联博接口

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.czshenhaifb.com/post/1315.html

网友评论

最新评论

  • Allbet电脑版下载 10/14 说:

    欧博开户欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。耐心看呀

  • Allbet电脑版下载 10/14 说:

    欧博开户欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。耐心看呀

  • UG环球客户端下载 10/14 说:

    Allbet电脑版下载欢迎进入Allbet电脑版下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。啥时候完结

  • Allbet电脑版下载 10/14 说:

    欧博开户欢迎进入欧博开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。觉得缺点什么

  • AllbetGmaing下载 10/14 说:

    Allbetwww.aLLbetgame.us欢迎进入Allbet平台(Allbet Gaming):www.aLLbetgame.us,欧博平台开放欧博(Allbet)开户、欧博(Allbet)代理开户、欧博(Allbet)电脑客户端、欧博(Allbet)APP下载等业务。留名,此文必火

  • ALLBET官网开户网址 10/14 说:

    环球UG欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。来了哦

  • Allbet开户 10/13 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。形容词都形容不出好

  • Allbet开户 10/13 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。形容词都形容不出好