10

从 brockallen 的文章中,他说“AuthenticateAsync() 可能会被多次调用”,这可能是 TransformAsync() 被多次调用(在我的应用程序上两次)的原因。

我不明白的是:

  1. 当我用参数构造 ClaimsIdentity 时,重复只发生在添加的声明(“现在”和“繁荣”)上。[参见下面的代码 1图像 1-A图像 1-B ]
  2. 当我构造没有参数的 ClaimsIdentity 时,添加的声明(“now”和“boom”)不会重复。[参见下面的代码 2图像 2-A图像 2-B ]
  3. 为什么添加的声明(nowboom)是重复的,而其他/预定义的声明(nbfexpissaud等)不是?[比较下图 1-A图 1-B ]

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


更新的问题:

我不明白的是:

  1. 当我用参数构造 ClaimsIdentity 时,重复只发生在添加的声明(“现在”和“繁荣”)上。[参见下面的代码 1图像 1-A图像 1-B ]
    (已回答)
  2. 当我构造没有参数的 ClaimsIdentity 时,添加的声明(“now”和“boom”)不会重复。[参见下面的代码 2图像 2-A图像 2-B ]
    (已回答)
  3. 为什么添加的声明(nowboom)是重复的,而其他/预定义的声明(nbfexpissaud等)不是?[比较下面的图 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);
    }
}

图 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);
    }
}

图 2-A

在此处输入图像描述

图 2-B

在此处输入图像描述

4

2 回答 2

3

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

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

于 2018-08-09T08:31:42.827 回答
2

我通过在ClaimsTransformer类中添加转换检查并将其在 DI 中注册为AddScoped()而不是 AddSingleton()解决了重复的自定义声明问题。

ClaimsTransformer.cs

class ClaimsTransformer : IClaimsTransformation
{
    private bool isTransformed = false;

    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        if (!isTransformed)
        {
            var id = ((ClaimsIdentity)principal.Identity).Clone();
            var ci = new ClaimsIdentity(id);

            // add custom claims here
            // e.g. ci.AddClaim(new Claim("boom", "hehehe"));

            isTransformed = true;

            var cp = new ClaimsPrincipal(ci);
            return Task.FromResult(cp);
        }

        return Task.FromResult(principal);
    }
}

启动.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // other ConfigureServices() codes here

        services.AddScoped<IClaimsTransformation, ClaimsTransformer>();

        // other ConfigureServices() codes here
    }

    // Other Startup codes here
}
于 2018-08-11T02:25:57.790 回答