private async Task <Tokens> CreateTokenAsync(User user)
        {
            List <Claim> claims = new List <Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim(ClaimTypes.Name, user.UserName ?? ""),
                new Claim(ClaimTypes.Email, user.Email ?? ""),
                new Claim(ClaimTypes.GivenName, user.NikeName ?? ""),
                new Claim(ClaimTypes.MobilePhone, user.Mobile ?? "")
            };
            //添加角色信息
            //TODO

            string token = _jsonWebTokenService.Encode(claims);

            string refreshToken = GenerateToken();

            user.LastLoginTime = DateTime.Now;
            user.RefreshToken  = refreshToken;
            await _userRepository.UpdateAsync(user);

            var jwtToken = _jsonWebTokenService.Decode(token);

            return(new Tokens(token, refreshToken, jwtToken["exp"]?.ToString()));
        }
Beispiel #2
0
        public void Jwt(string token)
        {
            if (token != "" && token.StartsWith("Bearer "))
            {
                token = token.Remove(0, 7);
                Dictionary <string, object> dict = jsonWebTokenService.Decode(token);
                JwtPayload JwtPayload            = new JwtSecurityTokenHandler().ReadJwtToken(token).Payload;
                object     nameobj = JwtPayload[ClaimTypes.NameIdentifier];

                string[] names = JsonConvert.DeserializeObject <string[]>(nameobj.ToString());

                object c2        = JwtPayload[ClaimTypes.Name];
                object GivenName = JwtPayload[ClaimTypes.GivenName];

                string id = JwtPayload.Claims.FirstOrDefault(r => r.Type == ClaimTypes.NameIdentifier)?.Value;
            }
        }
Beispiel #3
0
        public async Task <IActionResult> SignInBindCallBack(string provider, string redirectUrl = "", string token = "")
        {
            if (string.IsNullOrWhiteSpace(provider))
            {
                return(BadRequest());
            }

            if (!await HttpContext.IsProviderSupportedAsync(provider))
            {
                return(BadRequest());
            }

            if (token.IsNullOrEmpty() || !token.StartsWith("Bearer "))
            {
                return(Redirect($"{redirectUrl}#bind-result?code={ErrorCode.Fail}&message={HttpUtility.UrlEncode("请先登录")}"));
            }
            else
            {
                token = token.Remove(0, 7);
            }

            AuthenticateResult authenticateResult = await _contextAccessor.HttpContext.AuthenticateAsync(provider);

            if (!authenticateResult.Succeeded)
            {
                return(Redirect($"{redirectUrl}#bind-result?code=fail&message={authenticateResult.Failure.Message}"));
            }
            var openIdClaim = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier);

            if (openIdClaim == null || string.IsNullOrWhiteSpace(openIdClaim.Value))
            {
                return(Redirect($"{redirectUrl}#bind-result?code={ErrorCode.Fail}&message={HttpUtility.UrlEncode("未能获取openId")}"));
            }

            JwtPayload jwtPayload     = (JwtPayload)_jsonWebTokenService.Decode(token);
            string     nameIdentifier = jwtPayload.Claims.FirstOrDefault(r => r.Type == ClaimTypes.NameIdentifier)?.Value;

            if (nameIdentifier.IsNullOrWhiteSpace())
            {
                return(Redirect($"{redirectUrl}#bind-result?code={ErrorCode.Fail}&message={HttpUtility.UrlEncode("请先登录")}"));
            }
            long             userId = long.Parse(nameIdentifier);
            UnifyResponseDto unifyResponseDto;

            List <string> supportProviders = new List <string> {
                LinUserIdentity.Gitee, LinUserIdentity.GitHub, LinUserIdentity.QQ
            };

            if (!supportProviders.Contains(provider))
            {
                _logger.LogError($"未知的privoder:{provider},redirectUrl:{redirectUrl}");
                unifyResponseDto = UnifyResponseDto.Error($"未知的privoder:{provider}!");
            }
            else
            {
                IOAuth2Service oAuth2Service = _componentContext.ResolveNamed <IOAuth2Service>(provider);
                unifyResponseDto = await oAuth2Service.BindAsync(authenticateResult.Principal, provider, openIdClaim.Value, userId);
            }

            return(Redirect($"{redirectUrl}#bind-result?code={unifyResponseDto.Code.ToString()}&message={HttpUtility.UrlEncode(unifyResponseDto.Message.ToString())}"));
        }