代码之家  ›  专栏  ›  技术社区  ›  Ishara Madawa

我可以从承载令牌Web API检索用户名/身份以外的信息吗

  •  2
  • Ishara Madawa  · 技术社区  · 7 年前

    我对基于令牌的身份验证非常陌生。我可以从ClaimsPrincipal主体(身份)中读取用户名以外的内容吗。有没有办法读/写(存储)承载令牌中的其他信息。

    ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
    
    var Name = ClaimsPrincipal.Current.Identity.Name;
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Community CDub    3 年前

    附加信息存储在JWT的有效载荷部分中,称为索赔。 JWT描述见 RFC 7519 section 4 本rfc描述了标准索赔以及使用私人索赔名称的可能性。

    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的有效负载只是普通的JSON(在base64解码之后),因此您可以阅读所有声明。

    检查 https://jwt.io/ 例如。

        2
  •  2
  •   jps Virgilio Cossa    7 年前

    您可以使用“user\u 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;
    }