C# OnTokenValidated事件侦听器的TokenValidatedContext中的安全令牌缺少最后一个字符串段

C# OnTokenValidated事件侦听器的TokenValidatedContext中的安全令牌缺少最后一个字符串段,c#,.net-core,asp.net-core-webapi,adal,C#,.net Core,Asp.net Core Webapi,Adal,我正在使用Microsoft.AspNetCore.Authentication.JwtBearer和System.IdentityModel.Tokens.Jwt进行.NET核心项目 每当我生成一个新的令牌时,我都会将其存储到数据库中。首先,这是我如何生成一个新的令牌 public string GenerateToken(Dictionary<string, object> payload) { DateTime tokenExpiresAt =

我正在使用Microsoft.AspNetCore.Authentication.JwtBearerSystem.IdentityModel.Tokens.Jwt进行.NET核心项目

每当我生成一个新的令牌时,我都会将其存储到数据库中。首先,这是我如何生成一个新的令牌

    public string GenerateToken(Dictionary<string, object> payload)
    {
        DateTime tokenExpiresAt = DateTime.Now.AddMilliseconds(1); // from config
        byte[] symmetricKey = Convert.FromBase64String("secret"); // from config
        SymmetricSecurityKey symmetricSecurityKey = new SymmetricSecurityKey(symmetricKey);
    
        SecurityTokenDescriptor tokenDescriptor = new SecurityTokenDescriptor
        {
            Claims = payload,
            Expires = tokenExpiresAt,
            SigningCredentials = new SigningCredentials(symmetricSecurityKey, 
                SecurityAlgorithms.HmacSha256Signature)
        };
    
        JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
        SecurityToken securityToken = tokenHandler.CreateToken(tokenDescriptor);
        string token = tokenHandler.WriteToken(securityToken);

        return token;
    }
如您所见,我向
OnTokenValidated
事件侦听器添加了一个方法。此方法应检查数据库中是否存在令牌

    public async Task ProcessAfterTokenValidation(TokenValidatedContext tokenValidatedContext)
    {
        JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
        string token = jwtSecurityTokenHandler.WriteToken(tokenValidatedContext.SecurityToken);
        
        // ... check if token exists in db ...
    }
该方法的问题是,生成的令牌不是存储在数据库中的确切令牌。缺少最后一段。token变量保存这一点

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJ1C2VYBMFTZSI6INVZXIIIWIBMJMIJOXNTK1和Q1NJMXLCJLEHAIOJE1OTU0NDU2OTESIMLHDCI6MTQ0NTYMZMX0

缺少的最后一部分是

cWvSpKC_yYao2_ziW_ahjjjhpul2sguzvcmsjxntxcoi

有人知道为什么令牌的最后一部分丢失了吗


谢谢你的帮助

令牌的最后一部分是签名。该方法的目的是提供索赔实体。签名不是令牌持有人权利要求的组成部分

如果您在发布端有密钥轮换策略,那么给定的用户可以在密钥轮换前后使用不同的签名提交相同的声明

用户身份是由发卡机构加上识别用户的任何声明(例如,您示例中令牌中的
用户名
)组合而成


在您的情况下,由于您是颁发者,因此令牌减去签名仅表示用户已成功针对您的令牌颁发端点进行身份验证的证明。令牌中的声明应导致数据库记录,而不是令牌本身。

感谢您的回复。我的理解是:我可以将没有该签名的令牌存储到数据库中,或者在令牌验证期间将签名添加到令牌字符串中。我想知道的是,如果我能从某处获取签名,将其添加到auth令牌中,或从数据库令牌中减去它,或从生成的令牌中减去签名:)如果你坚持将令牌存储在数据库中,在最后一节课结束后切掉这一段。我建议根本不要存储令牌。仅供参考:我将令牌存储到数据库中,以确保如果用户注销,他的每个令牌都会从数据库中删除,如果有人使用他的令牌,他仍然会得到401,因为它不再有效。你有没有更好的办法使令牌失效?除了切掉字符串,没有办法生成签名?我知道每个段都带有一个“.”,但我不确定用这个字符拆分字符串是否干净
    public async Task ProcessAfterTokenValidation(TokenValidatedContext tokenValidatedContext)
    {
        JwtSecurityTokenHandler jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
        string token = jwtSecurityTokenHandler.WriteToken(tokenValidatedContext.SecurityToken);
        
        // ... check if token exists in db ...
    }