IClaimsTransformer有什么用?

LP1*_*P13 5 c# asp.net-core-mvc coreclr asp.net-core

在ASP.Net核心中,您可以使用IClaimsTransformer的实现.

你这样注册:

app.UseClaimsTransformation(o => o.Transformer = new MyClaimsTransformer());
Run Code Online (Sandbox Code Playgroud)

履行

public class MyClaimsTransformer : IClaimsTransformer
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
    {
        var identity = context.Principal.Identity as ClaimsIdentity;

        foreach (var claim in ci.Claims)
        {
           // you cannot modify claim.Type or claim.Value here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是ClaimsIdentity.Claims是只读属性.此外Claim.Type,Claim.Value是readonly属性.

这意味着在实施中IClaimsTransformer您只能添加新的声明.您无法删除或修改现有声明.

那么IClaimsTransformer的真实用途是什么?

blo*_*art 5

你注意到了返回类型吗?这是ClaimsPrincipal.

您可以构建一个全新的ClaimsPrincipal,在现有的中添加或更改您喜欢的任何内容并将其返回.

  • 这是一个标准模式吗?例如 - 我使用IdentityServer4作为OIDC提供程序来验证用户并向我的ASPNET核心应用程序提供id_token.但我的应用程序需要经过身份验证的用户才能获得业务域的声明.在查询某些业务服务以获取相关信息后,我使用声明转换来构建新的ClaimsPrincipal.据推测,我需要缓存此信息,因为转换将在每个请求上运行.有关于此的任何教程或指导吗?提前致谢.. (3认同)

Joe*_*tte 3

它的价值在于您可以补充身份验证 cookie 中存储的内容之外的声明。

它很有用,因为 cookie 中只能容纳这么多数据,如果您尝试放入太多数据,它就会被截断。

因此,如果您有大量声明或具有较大负载的声明,您可以将该数据存储在会话中,并使用声明转换将其添加到 ClaimsPrincipal 中。我不认为它是为了删除存储在 cookie 中的声明。如果您想添加或控制 cookie 中的声明,您可以在自定义 IClaimsPrincipalFactory 中执行此操作。