令牌处理程序无法将令牌转换为jwt令牌

thi*_*im9 1 asp.net jwt asp.net-web-api2

我正在尝试使用将令牌字符串转换为jwt令牌JwtSecurityTokenHandler。但是说那是错误的

IDX12709:CanReadToken()返回false。JWT的格式不正确:“ [[PII隐藏]”。\ n令牌必须采用JWS或JWE Compact序列化格式。(JWS):“ EncodedHeader.EndcodedPayload.EncodedSignature”。(JWE):“ EncodedProtectedHeader.EncodedEncryptedKey.EncodedInitializationVector.EncodedCiphertext.EncodedAuthenticationTag”。

我该如何解决这个问题?

这是我的令牌

var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
Run Code Online (Sandbox Code Playgroud)

调用Web API

using (HttpClient client = new HttpClient())
            {
                string path = "UserMaintenance/ValidateUserId?userid=" + txtUsername.Text.Trim().ToString();
                client.BaseAddress = new Uri(GlobalData.BaseUri);
                client.DefaultRequestHeaders.Add("Authorization", "Bearer" + GlobalData.Token);
                HttpResponseMessage response = client.GetAsync(path).Result;
                if (response.IsSuccessStatusCode)
                {
                    var value = response.Content.ReadAsStringAsync().Result;
                    isValid = JsonConvert.DeserializeObject<bool>(value);
                }
            }
Run Code Online (Sandbox Code Playgroud)

这是我的GetPrincipal方法

public static ClaimsPrincipal GetPrincipal(string token)
    {
        try
        {
            var symmetricKey = Convert.FromBase64String(Secret);
            var validationParameters = new TokenValidationParameters()
            {
                RequireExpirationTime = true,
                ValidateIssuer = false,
                ValidateAudience = false,
                IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
            };

            var handler = new JwtSecurityTokenHandler();
            handler.InboundClaimTypeMap.Clear();

            SecurityToken securityToken;
            var principal = handler.ValidateToken(token, validationParameters, out securityToken);

            return principal;
        }

        catch (Exception ex)
        {
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

rad*_*rad 5

这是我的方法,对我有用:

var token = new System.IdentityModel.Tokens.JwtSecurityToken(jwt);  
Run Code Online (Sandbox Code Playgroud)

上一行适用于System.IdentityModel.Tokens.Jwt软件包版本4.0.0。正如@Nick所评论的那样,在该软件包的最新版本中,JwtSecurityToken不再存在于先前的命名空间中,而是存在于该命名空间中,System.IdentityModel.Tokens.Jwt因此您需要编写: var token = new System.IdentityModel.Tokens.Jwt.JwtSecurityToken(jwt);

除非您的令牌格式不正确。如果您也共享令牌,那将更好。

更新:

您还需要从令牌的开头删除“ Bearer”一词(如果尚未删除):

 var jwt = context.Request.Headers["Authorization"].Replace("Bearer ", string.Empty);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您删除“承载”部分的提示。尽管如此,我仍然必须添加一个 .ToString() 调用才能使其为我工作: var jwt = _httpContextAccessor.HttpContext.Request.Headers["Authorization"].ToString().Replace("Bearer ", string.Empty) ; (2认同)