【问题标题】:Can i retrieve information other than username/Identity from bearer token Web API我可以从不记名令牌 Web API 中检索用户名/身份以外的信息吗
【发布时间】:2018-08-31 15:54:33
【问题描述】:

我对基于令牌的身份验证非常陌生。我可以从 ClaimsPrincipal 主体(身份)读取用户名以外的内容。有什么方法可以读取/写入(存储)不记名令牌中的其他信息。

ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

var Name = ClaimsPrincipal.Current.Identity.Name;

【问题讨论】:

  • 令牌是一个 jwt,如果你解密它,你可以读取它里面的内容。至于写它,真的应该留给身份服务器和 oauth 服务器作为它的工作。
  • 如果您想了解有关用户的更多信息,请查看是否可以找到您正在使用的登录服务器的 userinfo 端点。
  • @jps 实际上,由于请求标头的最大长度,承载令牌的大小受到限制,因此向声明中添加额外数据确实不是一个好主意。
  • @DaImTo 是的,有一个限制,通常在 8k 左右,所以一般建议不要在 JWT 中放置太多额外的有效负载是有道理的,但我不会去完全排除这一点.你真的需要很多额外的有效载荷才能达到极限。
  • 另一个考虑因素是数据是否会在相关令牌的生命周期内发生变化。您将获得不同步的数据。 (目前在我的前任设置的令牌中处理这个问题)

标签: c# asp.net asp.net-web-api jwt


【解决方案1】:

您可以使用“user_name”之类的键从您的不记名令牌中获取任何值。

private string GetUserName()
{       
    var claims = (ClaimsIdentity)ClaimsPrincipal.Current.Identity;

    if (claims == null)
    {
        return defaultValue;
    }

    var targetClaim = claims.FirstOrDefault(c => c.Type == "user_name");
    if (targetClaim == null)
    {
        return defaultValue;
    }

    return targetClaim.Value;
}

【讨论】:

  • 谢谢@S.Poline。作为您的代码示例,我们需要在名为“user_name”的 JWT 颁发者中添加新的声明类型,然后我们可以从不记名令牌中读取值。我说的对吗?
【解决方案2】:

附加信息存储在 JWT 的有效负载部分中,即所谓的声明。 JWT 在 RFC 7519 和此 rfc 的 section 4 中进行了描述,描述了标准声明以及使用私有声明名称的可能性。

JWT 颁发者(授权服务器)也可以向 JWT 写入附加声明,例如:

var identity = new ClaimsIdentity("JWT");  

identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); // standard claim
identity.AddClaim(new Claim("myClaim", "myClaimValue")); // private claim                

请注意:只有发行人才能向 JWT 添加信息,并且只能在 JWT 创建期间完成。

由于 JWT 的负载只是普通的 JSON(经过 base64 解码),您可以阅读所有声明。

查看https://jwt.io/ 获取示例。

【讨论】:

  • 谢谢@jps。非常有帮助。 JWT 发行人是我之前坚持的重点。我会试试你的信息。
  • 很高兴为您提供帮助。是的,JWT 颁发者是唯一可以添加信息的人,并且只能在他创建 JWT 时添加。
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2014-10-13
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多