如何向访问令牌添加自定义声明?

时间:2020-06-09 16:11:15

标签: .net-core jwt

我无法在我的访问令牌中添加自定义声明。

流程:

  1. 用户登录到我的Web应用程序(正在使用openid connect)
  2. Web应用程序将请求发送到api。
  3. 请求中包含授权标头(JWT访问令牌)
  4. JWT应该包含一个用户ID声明,以便api知道进行呼叫的用户的ID。

我在最后一部分遇到麻烦。我想在访问令牌中包含用户ID。在.NET Core中执行此操作的最佳方法是什么?用户ID仅在Web应用程序和api中已知。身份服务器对此一无所知。

我设法使用

将自定义声明放入我的身份
options.Events = new OpenIdConnectEvents
            {
                OnTicketReceived = e =>
                {
                    e.Principal = TransformClaims(e.Principal, services).Result;

                    return Task.CompletedTask;
                }
            };

private async Task<ClaimsPrincipal> TransformClaims(ClaimsPrincipal principal, IServiceCollection services)
{
    var sp = services.BuildServiceProvider();
    var profileService = sp.GetService<IProfileService>();

    Guid.TryParse(principal.Claims.FirstOrDefault(c => c.Type.Equals("contact_id"))?.Value, out Guid crmId);
    var profile = await profileService.GetProfileByCrmId(crmId);

    if (profile == null)
        _logger.LogWarning("User not found for contact_id {crmId}", crmId);

    var userId = (profile != null) ? profile.Id : 1;

    var transformed = new ClaimsPrincipal();
    transformed.AddIdentities(principal.Identities);
    transformed.AddIdentity(new ClaimsIdentity(new Claim[]
    {
        new Claim("user_id", userId.ToString())
    }));

    return transformed;
}

有没有办法在我想发送到我的api的访问令牌中获取此信息?

我的应用程序已经有一个access_token(我可以从httpcontext中提取它),但是它不包含声明。

  • 我应该在Web应用程序中创建一个新的JWT,向其中添加声明, 并发送到我的网络API?
  • 或者有没有办法修改现有的 访问我的应用程序的令牌? (类似于我在转换声明方法中所做的事情)

0 个答案:

没有答案