コード例 #1
0
        private async Task <JsonWebToken> CreateToken(string userId, string userName, RequestClientType clientType, RefreshToken refreshToken)
        {
            Check.NotNullOrEmpty(userId, nameof(userId));
            Check.NotNullOrEmpty(userName, nameof(userName));

            // New RefreshToken
            string clientId = refreshToken?.ClientId ?? Guid.NewGuid().ToString();

            Claim[] claims =
            {
                new Claim(ClaimTypes.NameIdentifier, userId),
                new Claim(ClaimTypes.Name,           userName),
                new Claim("clientId",                clientId),
                new Claim("clientType",              clientType.ToString())
            };
            var(token, expires) = CreateToken(claims, _jwtOptions, JwtTokenType.RefreshToken, refreshToken);
            string refreshTokenStr = token;
            await _provider.ExecuteScopedWorkAsync(async provider =>
            {
                UserManager <TUser> userManager = provider.GetService <UserManager <TUser> >();
                refreshToken = new RefreshToken()
                {
                    ClientId = clientId, Value = refreshTokenStr, EndUtcTime = expires
                };
                var result = await userManager.SetRefreshToken <TUser, TUserKey>(userId, refreshToken);
                if (result.Succeeded)
                {
                    IUnitOfWork unitOfWork = provider.GetUnitOfWork <TUser, TUserKey>();
                    unitOfWork.Commit();
                    IEventBus eventBus = _provider.GetService <IEventBus>();
                    OnlineUserCacheRemoveEventData eventData = new OnlineUserCacheRemoveEventData()
                    {
                        UserNames = new[] { userName }
                    };
                    eventBus.Publish(eventData);
                }
                return(result);
            },
                                                   false);

            // New AccessToken
            IAccessClaimsProvider claimsProvider = _provider.GetService <IAccessClaimsProvider>();

            claims = await claimsProvider.CreateClaims(userId);

            List <Claim> claimList = claims.ToList();

            claimList.Add(new Claim("clientId", clientId));
            claimList.Add(new Claim("clientType", clientType.ToString()));
            (token, _) = CreateToken(claimList, _jwtOptions, JwtTokenType.AccessToken);

            return(new JsonWebToken()
            {
                AccessToken = token,
                RefreshToken = refreshTokenStr,
                RefreshUctExpires = expires.ToJsGetTime().CastTo <long>(0)
            });
        }
コード例 #2
0
        /// <summary>
        /// Cookie验证通过时,从OnlineUser缓存或数据库查找用户的最新信息附加到有效的 ClaimIdentity 上
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task ValidatePrincipal(CookieValidatePrincipalContext context)
        {
            ClaimsPrincipal user     = context.Principal;
            ClaimsIdentity  identity = user.Identity as ClaimsIdentity;

            IAccessClaimsProvider accessClaimsProvider = context.HttpContext.RequestServices.GetService <IAccessClaimsProvider>();

            return(accessClaimsProvider.RefreshIdentity(identity));
        }
コード例 #3
0
        /// <summary>
        /// Token验证通过时,从OnlineUser缓存或数据库查找用户的最新信息附加到有效的 ClaimPrincipal 上
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override async Task TokenValidated(TokenValidatedContext context)
        {
            ClaimsPrincipal user     = context.Principal;
            ClaimsIdentity  identity = user.Identity as ClaimsIdentity;

            IAccessClaimsProvider            accessClaimsProvider = context.HttpContext.RequestServices.GetService <IAccessClaimsProvider>();
            OperationResult <ClaimsIdentity> result = await accessClaimsProvider.RefreshIdentity(identity);

            if (!result.Succeeded)
            {
                context.Fail(result.Message);
            }
        }