Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以从承载令牌Web API检索用户名/标识以外的信息吗_C#_Asp.net_Asp.net Web Api_Jwt - Fatal编程技术网

C# 我可以从承载令牌Web API检索用户名/标识以外的信息吗

C# 我可以从承载令牌Web API检索用户名/标识以外的信息吗,c#,asp.net,asp.net-web-api,jwt,C#,Asp.net,Asp.net Web Api,Jwt,我对基于令牌的身份验证非常陌生。我可以从ClaimsPrincipal主体(标识)读取用户名以外的内容吗。有没有办法读/写(存储)承载令牌中的其他信息 ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal; var Name = ClaimsPrincipal.Current.Identity.Name; 附加信息存储在JWT的有效载荷部分,称为索赔。 本rfc中描述了JWT,

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

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

var Name = ClaimsPrincipal.Current.Identity.Name;

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

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解码之后),因此您可以读取所有声明


查看示例。

您可以使用“用户名”之类的键从您的承载令牌中获取任何值


该令牌是一个jwt,如果您解密它,您可以读取其中的内容。至于写入,这实际上应该留给identity server和oauth server来完成,因为这是它的工作。如果您想了解有关用户的更多信息,请查看是否可以找到您正在使用的登录服务器的userinfo端点。@jps由于请求头的最大长度,实际上对承载令牌的大小有一个限制,因此需要向索赔真的不是一个好主意。@DaImTo是的,有一个限制,通常在8k左右,所以一般建议不要在JWT中添加太多额外的负载是有道理的,但我不会走这么远来完全排除这一点。您将需要大量额外的有效负载才能达到限制。另一个需要考虑的问题是,数据是否会在相关令牌的生命周期内发生变化。您将有不同步的数据。(目前正在处理这个问题,我的前任在token设置了很多东西)谢谢@jps。非常有用。JWT发行人是我之前一直坚持的观点。我会试试你的信息。很乐意帮忙。是的,JWT发行人是唯一可以添加信息的人,并且只有在他创建JWT时才能添加信息。谢谢@S.Poline。作为您的代码示例,我们需要在JWT发卡机构中添加名为“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;
}