예제 #1
0
        public async Task <ActionResult> PermitSignIn([FromBody] QRToken token)
        {
            var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

            if (!int.TryParse(userId, out int uid))
            {
                return(BadRequest(new { error = "Unknow user ID." }));
            }
            var item = await _repo.PermitByToken(token.Token, uid);

            if (item == null)
            {
                return(BadRequest(new { error = "No such code or expired." }));
            }
            return(Ok());
        }
예제 #2
0
        public async Task <ActionResult <Token> > CheckStatus([FromBody] QRToken token)
        {
            const int delayTime = 2000;
            var       item      = await _repo.GetById(token.Id);

            if (item == null)
            {
                return(BadRequest(new { error = "No such code." }));
            }
            for (int i = 0; i < 60000 / delayTime; i++)
            {
                // 获取最新数据
                _repo.GetLatest(ref item);
                if (item.Expires < DateTime.UtcNow)
                {
                    return(BadRequest(new { error = "Code expired." }));
                }
                else if (item.Status == 1)
                {
                    var user = await _userRepo.GetUser(item.UserId.ToString());

                    var refreshToken = _service.GenerateRefreshToken();

                    // Return jwt token.
                    return(new Token
                    {
                        AccessToken = _service.GenerateToken(new Claim[]
                        {
                            new Claim(ClaimTypes.NameIdentifier, user.UserId.ToString()),
                            new Claim(ClaimTypes.Name, user.Username),
                            new Claim(ClaimTypes.Role, user.UserGroup.ToString()),
                        }),
                        Expires = DateTime.UtcNow.AddDays(7).ToString(),
                        RefreshToken = refreshToken,
                        UserId = item.UserId
                    });
                }
                else
                {
                    await Task.Delay(delayTime);
                }
            }
            return(StatusCode(408, new { error = "Request time out." }));
        }
예제 #3
0
 public void GetLatest(ref QRToken token)
 {
     _context.Entry(token).Reload();
 }