Asp.net core 在ASP.NET核心中的Claims Transformer中获取访问令牌
我正在开发一组应用程序,包括使用IdentityServer4的Identity Server、.NET核心MVC应用程序、.NET核心WebAPI 作为asp.net核心mvc应用程序的一部分,我正在使用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上的权限端点,用声明填充主体,我可以使用声明对控制器进行授权等
AddOpenIdConnect
进行身份验证并执行选项。SaveTokens
=true
但是,作为声明转换的一部分,在TransformAsync
中,我希望能够访问identityserver提供的访问令牌。这是为了能够调用api上的权限端点,用声明填充主体,我可以使用声明对控制器进行授权等
如果我调用HttpContext.GetTokenAsync(“访问令牌”)
我会得到一个stackoverflowexception,这是由于调用authenticate创建的无限循环,然后再次调用TransformAsync
首先,这是一个合理的方法吗?通常,TransformAsync
是我填充应用程序权限的地方。有没有办法在不再次触发身份验证的情况下访问令牌
非常感谢您的帮助,因为我们有点为难!谢谢
编辑:我已经看到了关于在OnTicketReceived中进行转换的建议
事件看起来我可以通过那里的属性访问令牌。这是一个更好的地方吗?我认为您可以注入IAAuthenticationHandlerProvider服务并使用以下内容:
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
,因此我们陷入无限循环。