我正在开发一组应用程序,包括使用IdentityServer4的Identity Server,.NET Core MVC应用程序,.NET Core WebAPI。
作为asp.net核心mvc应用程序的一部分,我使用AddOpenIdConnect
进行身份验证并执行options.SaveTokens
= true。
但是,作为声明转换的一部分,在TransformAsync
中,我希望能够访问身份服务器提供的访问令牌。这是为了能够在api上调用权限端点来填充主体,声明我可以用来在我的控制器上进行授权等。
如果我调用HttpContext.GetTokenAsync("access_token")
,我会得到一个stackoverflowexception,因为被调用的authenticate创建了无限循环,然后再次调用TransformAsync
。
这首先是一个合理的方法吗?通常,TransformAsync
是我填充应用程序权限的地方。有没有办法在不再触发身份验证的情况下访问令牌?
感谢任何帮助,因为我们有点难过!感谢
编辑:我已经看到有关在OnTicketReceived中进行转换的建议 事件。看起来我可以通过其中的属性访问令牌。这是一个更好的地方吗?
答案 0 :(得分:1)
我遇到了同样的问题。我的解决方案是,
覆盖JwtBearerEvents.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
才能访问HttpContext
中的ClaimsTransformer
。
答案 1 :(得分:0)
我认为您可以注入IAuthenticationHandlerProvider服务并使用以下内容:
从身份验证属性中获取令牌
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);
}
没有对它进行测试,但我认为它应该可行