Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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# 如何在asp.net core 3.1中使用自动生成的刷新令牌?_C#_Security_Asp.net Core_Jwt - Fatal编程技术网

C# 如何在asp.net core 3.1中使用自动生成的刷新令牌?

C# 如何在asp.net core 3.1中使用自动生成的刷新令牌?,c#,security,asp.net-core,jwt,C#,Security,Asp.net Core,Jwt,在我的ASPNETCore3.1项目中,我使用CQRS模式和JWT身份验证,我希望 为了在令牌过期时实现自动刷新令牌,而不是每次用户都要求输入用户名和密码,我也不想在db中存储刷新令牌。刷新令牌的最佳方式是什么 public class JwtGenerator : IJwtGenerator { private readonly SymmetricSecurityKey _key; public JwtGenerator(IConfigurat

在我的ASPNETCore3.1项目中,我使用CQRS模式和JWT身份验证,我希望 为了在令牌过期时实现自动刷新令牌,而不是每次用户都要求输入用户名和密码,我也不想在db中存储刷新令牌。刷新令牌的最佳方式是什么

    public class JwtGenerator : IJwtGenerator
    {
        private readonly SymmetricSecurityKey _key;

        public JwtGenerator(IConfiguration config)
        {
            _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
        }

        public string GenerateToken(int size=32)
        {
            var randomNumber = new byte[size];
            using var rng = RandomNumberGenerator.Create();
            rng.GetBytes(randomNumber);
            return Convert.ToBase64String(randomNumber);
        }
        public string CreateToken(User user)
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.UserName),
                new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
            };

            var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddDays(1),
                SigningCredentials = creds
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return tokenHandler.WriteToken(token);
        }
    }
我的jwtgenerator类用于令牌和刷新令牌

    public class JwtGenerator : IJwtGenerator
    {
        private readonly SymmetricSecurityKey _key;

        public JwtGenerator(IConfiguration config)
        {
            _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
        }

        public string GenerateToken(int size=32)
        {
            var randomNumber = new byte[size];
            using var rng = RandomNumberGenerator.Create();
            rng.GetBytes(randomNumber);
            return Convert.ToBase64String(randomNumber);
        }
        public string CreateToken(User user)
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.UserName),
                new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
            };

            var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddDays(1),
                SigningCredentials = creds
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return tokenHandler.WriteToken(token);
        }
    }
登录后,我将返回正确的结果:

{
    "token": "mytoken",
    "refreshToken": "tha1qH7PTx4PNoVeD7D7h/BmEZfdS42zWxriexePWlg="
}

另外,我没有找到任何CQR的例子。

你在那里做的事情被称为“输入”。在我看来,这几乎是一个最小的实现。您需要具有刷新令牌值或至少一个将令牌锚定在授权层中的参考值。它不必是一个数据库来存储这样的值,您可以有内存存储、物理文件或任何您想要的东西。但无论如何,您需要保留该值以便稍后验证

下面是标准通信流,它解释了使用刷新令牌的场景

    public class JwtGenerator : IJwtGenerator
    {
        private readonly SymmetricSecurityKey _key;

        public JwtGenerator(IConfiguration config)
        {
            _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config.GetSection("AppSettings:Token").Value));
        }

        public string GenerateToken(int size=32)
        {
            var randomNumber = new byte[size];
            using var rng = RandomNumberGenerator.Create();
            rng.GetBytes(randomNumber);
            return Convert.ToBase64String(randomNumber);
        }
        public string CreateToken(User user)
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.UserName),
                new Claim(ClaimTypes.Role, user.Role.ToString("G").ToLower())
            };

            var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddDays(1),
                SigningCredentials = creds
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenDescriptor);
            return tokenHandler.WriteToken(token);
        }
    }
1.5。刷新令牌

刷新令牌是用于获取访问令牌的凭据。刷新 令牌由授权服务器颁发给客户端,并且 用于在当前访问令牌失效时获取新的访问令牌 变得无效或过期,或获取其他访问令牌 具有相同或较窄的范围(访问令牌可能具有较短的 生存期和权限少于资源授权的权限 所有者)。发布刷新令牌是可选的,由 授权服务器。如果授权服务器发出刷新 令牌,它包括在发出访问令牌时(即,中的步骤(D)) 图1)

刷新令牌是表示授予的授权的字符串 客户端由资源所有者创建。字符串通常对用户是不透明的 客户。令牌表示用于检索授权信息的标识符。与访问令牌不同,刷新令牌是 仅用于授权服务器,从不发送 到资源服务器

 +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+

              Figure 2: Refreshing an Expired Access Token
+----------++---------------+
|(A)授权授予|
|        |                                           |               |
|        ||          |   |               |
|        |                            |          |   |               |
|        ||          |   |               |
|        |                            |          |   |               |
|        ||               |
|        |                                           |               |
|        |