Пример #1
0
        public IActionResult Token(LoginModel login)
        {
            _logger.LogInformation($"获取Token:User:{login.User}");
            if (string.IsNullOrEmpty(login.User) || string.IsNullOrEmpty(login.Password))//判断账号密码是否正确
            {
                return(BadRequest());
            }


            var claim = new List <Claim> {
                new Claim(ClaimTypes.Name, login.User),
                new Claim(ClaimTypes.Role, "Test")
            };

            //登录的账户缓存
            if (DataCache.loginUserDict.ContainsKey(login.User))
            {
                //这个时间可以调长点
                if (DataCache.loginUserDict[login.User].Item3.AddSeconds(10) > DateTime.Now)
                {
                    return(Ok(new { message = "已经有用户登录,请10S之后在登录,并且修改密码。" }));
                }
                DataCache.loginUserDict.Remove(login.User);
            }
            string tempToken      = Guid.NewGuid().ToString();
            string tempRefshToken = Guid.NewGuid().ToString();

            DataCache.loginUserDict.Add(login.User, new Tuple <string, string, DateTime>(tempToken, tempRefshToken, DateTime.Now));
            DataCache.AddRefreshToken(login.User, tempRefshToken);
            claim.Add(new Claim("token", tempToken));

            //建立增加策略的授权
            if (login.User == "Test")
            {
                claim.Add(new Claim("Test", "Test"));
            }
            if (login.User == "Test1")
            {
                claim.Add(new Claim("Test", "Test1"));
            }
            if (login.User == "Test2")
            {
                claim.Add(new Claim("Test", "Test2"));
            }
            if (login.User == "Test3")
            {
                claim.Add(new Claim("Test", "Test3"));
            }

            //对称秘钥
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
            //签名证书(秘钥,加密算法)
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //生成token  [注意]需要nuget添加Microsoft.AspNetCore.Authentication.JwtBearer包,并引用System.IdentityModel.Tokens.Jwt命名空间
            var token = new JwtSecurityToken(_jwtSettings.Issuer, _jwtSettings.Audience, claim, DateTime.Now, DateTime.Now.AddMinutes(30), creds);


            return(Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token), refreshtoken = tempRefshToken }));//refreshtoken:jwt过期,刷新token
        }