(ClaimsIdentity)重复自定义声明

Joe*_*Joe 10 .net claims .net-core

从brockallen的文章中,他说"AuthenticateAsync()可能会被多次调用",这可能是为什么TransformAsync()被多次调用的原因(在我的应用程序中两次).

我没有得到的是:

  1. 当我构造ClaimsIdentity WITH参数时,复制只发生在添加的声明('now'和'boom')上.[见下面的代码1,图1-A图1-B ]
  2. 当我构造ClaimsIdentity WITHOUT参数时,添加的声明('now'和'boom')不会重复.[见下面的代码2,图2-A图2-B ]
  3. 为什么其他/预先定义的声明(nbf,exp,iss,aud等等)没有被复制的声明(现在繁荣)怎么样?[比较下面的图像1-A图像1-B ]

有人知道为什么ClaimsIdentity会这样吗?


更新的问题:

我没有得到的是:

  1. 当我构造ClaimsIdentity WITH参数时,复制只发生在添加的声明('now'和'boom')上.[见下文第1代,图1-A图1-B ]
    (已回答)
  2. 当我构造ClaimsIdentity WITHOUT参数时,添加的声明('now'和'boom')不会重复.[见下面的代码2,图2-A图2-B ]
    (已回答)
  3. 为什么其他/预先定义的声明(nbf,exp,iss,aud等等)没有被复制的声明(现在繁荣)怎么样?[比较下面的图像1-A图像1-B ] (未回答,但替代代码发布在下面)

代码1

class ClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var id = ((ClaimsIdentity)principal.Identity);
        var ci = new ClaimsIdentity(id.Claims, id.AuthenticationType, id.NameClaimType, id.RoleClaimType);

        ci.AddClaim(new Claim("now", DateTime.Now.ToString()));
        ci.AddClaim(new Claim("boom", "hehehe"));

        var cp = new ClaimsPrincipal(ci);

        return Task.FromResult(cp);
    }
}
Run Code Online (Sandbox Code Playgroud)

图1-A

在此输入图像描述

图1-B

在此输入图像描述


代码2

class ClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var ci = new ClaimsIdentity();

        ci.AddClaim(new Claim("now", DateTime.Now.ToString()));
        ci.AddClaim(new Claim("boom", "hehehe"));

        var cp = new ClaimsPrincipal(ci);

        return Task.FromResult(cp);
    }
}
Run Code Online (Sandbox Code Playgroud)

图2-A

在此输入图像描述

图2-B

在此输入图像描述

小智 3

回答问题 1:
我意识到会发生重复,因为我正在复制主体中的值并返回添加的自定义声明。

回答问题 2:
我意识到复制永远不会发生,因为我总是创建一个新的 ClaimsIdentity 并且从不复制主体中的值。