在ASP.NET Core中的Claims Transformer中获取访问令牌

时间:2017-12-21 16:27:43

标签: asp.net-core asp.net-core-mvc openid-connect identityserver4 claims-based-identity

我正在开发一组应用程序,包括使用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中进行转换的建议 事件。看起来我可以通过其中的属性访问令牌。这是一个更好的地方吗?

2 个答案:

答案 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服务并使用以下内容:

  1. 按方案名称获取身份验证处理程序。
  2. 通过调用AuthenticateAsync
  3. 获取AuthenticateResult
  4. 从身份验证属性中获取令牌

    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);
    }
    
  5. 没有对它进行测试,但我认为它应该可行