コード例 #1
0
        /// <summary>
        ///     绑定第三方并且授权
        /// </summary>
        /// <param name="openId"></param>
        /// <param name="unionId"></param>
        /// <param name="platform"></param>
        /// <param name="output"></param>
        /// <param name="user"></param>
        /// <param name="unitOfWork"></param>
        /// <returns></returns>
        private async Task BindAndTokenAuth(string openId, string unionId, OpenIdPlatforms?platform,
                                            AppRegisterOrLoginOutput output, User user, IUnitOfWorkCompleteHandle unitOfWork)
        {
            #region 关联第三方OpenId

            if (!openId.IsNullOrEmpty() || !unionId.IsNullOrEmpty())
            {
                var appTokenAuthInput = new AppTokenAuthInput
                {
                    OpenIdOrUnionId = unionId ?? openId
                };
                switch (platform)
                {
                case OpenIdPlatforms.WeChat:
                    appTokenAuthInput.From = openId.IsNullOrWhiteSpace()
                            ? AppTokenAuthInput.FromEnum.WeChatUnionId
                            : AppTokenAuthInput.FromEnum.WeChat;
                    break;

                case OpenIdPlatforms.WechatMiniProgram:
                    appTokenAuthInput.From = AppTokenAuthInput.FromEnum.WeChatMiniProgram;
                    break;

                default:
                    break;
                }


                if (platform != null && !_appUserOpenIdResposotory.GetAll().Any(p =>
                                                                                (p.OpenId == openId || p.UnionId == unionId) && p.From == platform && p.UserId == user.Id &&
                                                                                p.TenantId == AbpSession.TenantId))
                {
                    var appUserOpenId = new AppUserOpenId
                    {
                        OpenId       = openId,
                        UnionId      = unionId,
                        From         = platform.Value,
                        UserId       = user.Id,
                        CreationTime = Clock.Now,
                        TenantId     = AbpSession.TenantId
                    };
                    _appUserOpenIdResposotory.Insert(appUserOpenId);
                }
            }

            //获取授权信息
            var result = await CreateToken(user);

            output.AccessToken     = result.AccessToken;
            output.ExpireInSeconds = result.ExpireInSeconds;
            output.UserId          = result.UserId;
            output.Phone           = user.PhoneNumber;
            await unitOfWork.CompleteAsync();

            #endregion
        }
コード例 #2
0
        private async Task <AppRegisterOrLoginOutput> RegisterOrLogin(string phone  = null, string name    = null,
                                                                      string openId = null, string unionId = null, OpenIdPlatforms?platform = null)
        {
            var output = new AppRegisterOrLoginOutput();

            using (var unitOfWork = _unitOfWorkManager.Begin())
            {
                User user;
                if (phone != null)
                {
                    user = _userManager.Users.FirstOrDefault(p => p.PhoneNumber == phone);
                    if (user != null)
                    {
                        await BindAndTokenAuth(openId, unionId, platform, output, user, unitOfWork);

                        return(output);
                    }
                }

                var hasPhone = !phone.IsNullOrEmpty();
                //支持游客注册
                var userName = hasPhone ? phone : Guid.NewGuid().ToString("N");
                user = new User
                {
                    IsActive    = true,
                    Name        = name ?? "游客",
                    PhoneNumber = phone,
                    UserName    = userName,
                    TenantId    = AbpSession.TenantId,
                    Password    = User.CreateRandomPassword(),
                    ShouldChangePasswordOnNextLogin = false,
                    IsPhoneNumberConfirmed          = hasPhone,
                    EmailAddress = userName + "@xin-lai.com",
                    Surname      = name ?? "游客"
                };
                user.Password = _passwordHasher.HashPassword(user, user.Password);
                output.Phone  = phone;

                CheckErrors(await _userManager.CreateAsync(user));
                await BindAndTokenAuth(openId, unionId, platform, output, user, unitOfWork);
            }

            return(output);
        }