Asp.net core 在ASP.NET核心中的Claims Transformer中获取访问令牌

Asp.net core 在ASP.NET核心中的Claims Transformer中获取访问令牌,asp.net-core,asp.net-core-mvc,openid-connect,identityserver4,claims-based-identity,Asp.net Core,Asp.net Core Mvc,Openid Connect,Identityserver4,Claims Based Identity,我正在开发一组应用程序,包括使用IdentityServer4的Identity Server、.NET核心MVC应用程序、.NET核心WebAPI 作为asp.net核心mvc应用程序的一部分,我正在使用AddOpenIdConnect进行身份验证并执行选项。SaveTokens=true 但是,作为声明转换的一部分,在TransformAsync中,我希望能够访问identityserver提供的访问令牌。这是为了能够调用api上的权限端点,用声明填充主体,我可以使用声明对控制器进行授权等

我正在开发一组应用程序,包括使用IdentityServer4的Identity Server、.NET核心MVC应用程序、.NET核心WebAPI

作为asp.net核心mvc应用程序的一部分,我正在使用
AddOpenIdConnect
进行身份验证并执行
选项。SaveTokens
=true

但是,作为声明转换的一部分,在
TransformAsync
中,我希望能够访问identityserver提供的访问令牌。这是为了能够调用api上的权限端点,用声明填充主体,我可以使用声明对控制器进行授权等

如果我调用
HttpContext.GetTokenAsync(“访问令牌”)
我会得到一个stackoverflowexception,这是由于调用authenticate创建的无限循环,然后再次调用
TransformAsync

首先,这是一个合理的方法吗?通常,
TransformAsync
是我填充应用程序权限的地方。有没有办法在不再次触发身份验证的情况下访问令牌

非常感谢您的帮助,因为我们有点为难!谢谢

编辑:我已经看到了关于在OnTicketReceived中进行转换的建议
事件看起来我可以通过那里的属性访问令牌。这是一个更好的地方吗?

我认为您可以注入IAAuthenticationHandlerProvider服务并使用以下内容:

  • 按方案名称获取身份验证处理程序
  • 通过调用AuthenticateTasync获取AuthenticateResult
  • 从身份验证属性获取令牌

    var token = string.Empty;
    var handler = await Handlers.GetHandlerAsync(context, scheme); // i.e. "OIDC"
    var result = await handler.AuthenticateAsync();
    if(result?.Succeeded == true) {
        token = result?.Properties?.GetTokenValue(tokenName);
    }
    

  • 我还没有测试过它,但我认为它应该能工作

    我遇到了同样的问题。我的解决办法是

    重写
    JWTBeareEvents.TokenValidated
    IdentityServer4.AccessTokenValidation
    中间件调用的事件

    private Task OnTokenValidated(TokenValidatedContext tokenValidatedContext)
        {
            tokenValidatedContext.HttpContext.Items["access_token"] = (tokenValidatedContext.SecurityToken as JwtSecurityToken).RawData;
            return Task.CompletedTask;
        }
    
    这将利用请求范围内的
    HttpContext.Items
    集合。现在,您可以在
    TransformAsync
    方法中检索此访问令牌,如下所示

    var access_token = _httpContextAccessor.HttpContext.Items["access_token"] as string;
    

    请注意,您需要注入
    IHttpContextAccessor
    来访问
    ClaimsTransformer
    中的
    HttpContext

    我建议您查看创建ProfileService并将其添加到管道中的步骤,只需很少的额外工作,它就会为您将索赔信息拉入JWT令牌中。不确定这是否是你想要的。一开始我也有点困惑,但这一点额外的帮助实现了已经在IS4中的IProfileService。然后我用DI访问
    UserManager
    ,并抓取
    IUserClaimsPrincipalFactory
    ,从上下文中提取用户信息。感谢您的回复,但我不确定这是否是我们正在寻找的。配置文件服务似乎只是为了添加额外的声明(仍然与标识本身相关),这些声明尚未在初始cookie中填充。我们正在寻找的是,当用户发出请求时,应用程序声明将从API填充到客户端。谢谢。是的,OnTicketReceived或许多其他OIDC活动都可以用于此。谢谢您的回复。不幸的是,这种方法和我原来的帖子一样会导致同样的问题
    AuthenticateAsync
    触发
    TransformAsync
    ,因此我们陷入无限循环。