使用 C 撤销 JWT#

我有一个自定义类,当用户从服务器请求数据或任何内容时,我用它来使令牌失效Authorize


但每当令牌过期时,原则仍然返回为 true,并且仍然调用控制器并获取数据。IsAuthenticated


我希望它做的是使令牌失效并显式注销用户退出系统。我找不到任何有用的东西。如果需要,我可以提供JWT属性/过滤器的代码


更新 1:令牌生成


public static string GenerateToken(User user)

{

    int expireMinutes;

    try

    {

        expireMinutes = string.IsNullOrEmpty(ConfigurationManager.AppSettings["SessionTimeInMinutes"])

            ? 30

            : int.Parse(ConfigurationManager.AppSettings["SessionTimeInMinutes"]);

    }

    catch (Exception)

    {

        expireMinutes = 30;

    }

    var symmetricKey = Convert.FromBase64String(Secret);

    var tokenHandler = new JwtSecurityTokenHandler();

    var now = DateTime.Now;

    var tokenDescriptor = new SecurityTokenDescriptor

    {

        Subject = new ClaimsIdentity(new[]

        {

            new Claim(ClaimTypes.Email, user.Email)

            ,new Claim(ClaimTypes.Name, user.FirstName + " " + user.LastName)

            ,new Claim("uid", user.Id.ToString())

            ,new Claim("cid", user.ClientId.ToString())

            ,new Claim("rid", string.Join(",", user.Roles.Select(r => r.RoleId).ToList()))

        }),

        Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)),

        IssuedAt = now,

        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature)

    };

    var stoken = tokenHandler.CreateToken(tokenDescriptor);

    var token = tokenHandler.WriteToken(stoken);

    return token;

}


ITMISS
浏览 160回答 2
2回答

qq_遁去的一_1

首先:JWT只是客户端可以操作的客户端令牌。这里没有绝对的安全。JWT 由符号键保护,但不能自行失效。有效令牌在过期之前一直有效。这是JWT的一个缺陷(正如@TimBiegeleisen在评论中指出的那样),令牌本身不能轻易失效。如果用户工作太久并被自动注销,则您的JWT已过期,并且一切都很好。没有麻烦,因为它自然耗尽,你没有必要采取行动。要使令牌失效,您需要使用 创建一个新令牌。这样,下次您下次检查JWT时,您看到它已过期。Expires = now.AddMinutes(-1)用户即使在注销后也可以保存JWT并使用它的情况只能通过将JWT列入黑名单或偶尔维护某种其他类型的服务器端会话(这不起作用,即无状态Web服务)来实现。编辑:删除了错误信息,并添加了使 JWT 失效(黑名单)的其他方法

千巷猫影

您可以简单地兑现要撤销的令牌,然后使您的身份验证部分将已撤销的请求与现金中的令牌进行比较,并基于该请求拒绝该请求在代币到期之前,现金应该知道代币的重新开采时间,并兑现那么长时间
打开App,查看更多内容
随时随地看视频慕课网APP