public virtual async Task <IdentityUserDto> RegisterAsync(WeChatRegisterDto input)
        {
            await CheckSelfRegistrationAsync();

            var wehchatOpenId = await WeChatOpenIdFinder.FindAsync(input.Code);

            var user = await UserManager.FindByLoginAsync(AbpWeChatAuthorizationConsts.ProviderKey, wehchatOpenId.OpenId);

            if (user != null)
            {
                // 应该要抛出微信号已注册异常,而不是直接返回注册用户数据,否则造成用户信息泄露
                throw new UserFriendlyException(L["DuplicateWeChat"]);
            }
            var userName  = input.UserName ?? "wx-" + wehchatOpenId.OpenId;
            var userEmail = input.EmailAddress ?? $"{userName}@{CurrentTenant.Name ?? "default"}.io";//如果邮件地址不验证,随意写入一个

            user = new IdentityUser(GuidGenerator.Create(), userName, userEmail, CurrentTenant.Id)
            {
                Name = input.Name ?? userName
            };
            (await UserManager.CreateAsync(user, input.Password)).CheckErrors();

            (await UserManager.AddDefaultRolesAsync(user)).CheckErrors();

            var userLogin = new UserLoginInfo(AbpWeChatAuthorizationConsts.ProviderKey, wehchatOpenId.OpenId, AbpWeChatAuthorizationConsts.DisplayName);

            (await UserManager.AddLoginAsync(user, userLogin)).CheckErrors();

            return(ObjectMapper.Map <IdentityUser, IdentityUserDto>(user));
        }
Exemplo n.º 2
0
        public virtual async Task <IdentityUserDto> RegisterAsync(WeChatRegisterDto input)
        {
            await CheckSelfRegistrationAsync();

            var wehchatOpenId = await WeChatOpenIdFinder.FindAsync(input.Code);

            var user = await UserManager.FindByLoginAsync("WeChat", wehchatOpenId.OpenId);

            if (user != null)
            {
                // 应该要抛出微信号已注册异常,而不是直接返回注册用户数据,否则造成用户信息泄露
                throw new UserFriendlyException(L["DuplicateWeChat"]);
            }
            var userName  = input.UserName ?? wehchatOpenId.OpenId;
            var userEmail = input.EmailAddress ?? $"{userName}@{new Random().Next(1000, 99999)}.com";//如果邮件地址不验证,随意写入一个

            user = new IdentityUser(GuidGenerator.Create(), userName, userEmail, CurrentTenant.Id)
            {
                Name = input.Name ?? userName
            };
            (await UserManager.CreateAsync(user, input.Password)).CheckErrors();

            (await UserManager.AddDefaultRolesAsync(user)).CheckErrors();

            var userLogin = new UserLoginInfo("WeChat", wehchatOpenId.OpenId, "微信认证登录");

            (await UserManager.AddLoginAsync(user, userLogin)).CheckErrors();

            return(ObjectMapper.Map <IdentityUser, IdentityUserDto>(user));
        }
        public async Task ValidateAsync(ExtensionGrantValidationContext context)
        {
            var raw        = context.Request.Raw;
            var credential = raw.Get(OidcConstants.TokenRequest.GrantType);

            if (credential == null || !credential.Equals(GrantType))
            {
                Logger.LogWarning("Invalid grant type: not allowed");
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant,
                                                           Localizer["InvalidGrant:GrantTypeInvalid"]);
                return;
            }
            // TODO: 统一命名规范, 微信认证传递的 code 改为 WeChatOpenIdConsts.WeCahtCodeKey
            var wechatCode = raw.Get(WeChatValidatorConsts.WeChatValidatorTokenName);

            if (wechatCode.IsNullOrWhiteSpace() || wechatCode.IsNullOrWhiteSpace())
            {
                Logger.LogWarning("Invalid grant type: wechat code not found");
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant,
                                                           Localizer["InvalidGrant:WeChatCodeNotFound"]);
                return;
            }
            var wechatOpenId = await WeChatOpenIdFinder.FindAsync(wechatCode);

            var currentUser = await UserManager.FindByLoginAsync(AbpWeChatAuthorizationConsts.ProviderKey, wechatOpenId.OpenId);

            if (currentUser == null)
            {
                Logger.LogWarning("Invalid grant type: wechat openid: {0} not register", wechatOpenId.OpenId);
                context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant,
                                                           Localizer["InvalidGrant:WeChatNotRegister"]);
                return;
            }
            var sub = await UserManager.GetUserIdAsync(currentUser);

            var additionalClaims = new List <Claim>();

            if (currentUser.TenantId.HasValue)
            {
                additionalClaims.Add(new Claim(AbpClaimTypes.TenantId, currentUser.TenantId?.ToString()));
            }
            additionalClaims.Add(new Claim(AbpWeChatClaimTypes.OpenId, wechatOpenId.OpenId));
            if (!wechatOpenId.UnionId.IsNullOrWhiteSpace())
            {
                additionalClaims.Add(new Claim(AbpWeChatClaimTypes.UnionId, wechatOpenId.UnionId));
            }

            await EventService.RaiseAsync(new UserLoginSuccessEvent(currentUser.UserName, wechatOpenId.OpenId, null));

            context.Result = new GrantValidationResult(sub,
                                                       WeChatValidatorConsts.AuthenticationMethods.BasedWeChatAuthentication, additionalClaims.ToArray());
        }
Exemplo n.º 4
0
        public virtual async Task RegisterAsync(WeChatRegisterDto input)
        {
            ThowIfInvalidEmailAddress(input.EmailAddress);

            await CheckSelfRegistrationAsync();

            await IdentityOptions.SetAsync();

            var options = await MiniProgramOptionsFactory.CreateAsync();

            var wehchatOpenId = await WeChatOpenIdFinder.FindAsync(input.Code, options.AppId, options.AppSecret);

            var user = await UserManager.FindByLoginAsync(AbpWeChatMiniProgramConsts.ProviderKey, wehchatOpenId.OpenId);

            if (user != null)
            {
                // 应该要抛出微信号已注册异常,而不是直接返回注册用户数据,否则造成用户信息泄露
                throw new UserFriendlyException(L["DuplicateWeChat"]);
            }
            var userName = input.UserName;

            if (userName.IsNullOrWhiteSpace())
            {
                userName = "******" + wehchatOpenId.OpenId.ToMd5().ToLower();
            }

            var userEmail = input.EmailAddress;//如果邮件地址不验证,随意写入一个

            if (userEmail.IsNullOrWhiteSpace())
            {
                userEmail = $"{userName}@{CurrentTenant.Name ?? "default"}.io";
            }

            user = new IdentityUser(GuidGenerator.Create(), userName, userEmail, CurrentTenant.Id);
            (await UserManager.CreateAsync(user, input.Password)).CheckErrors();

            (await UserManager.AddDefaultRolesAsync(user)).CheckErrors();

            var userLogin = new UserLoginInfo(AbpWeChatMiniProgramConsts.ProviderKey, wehchatOpenId.OpenId, AbpWeChatGlobalConsts.DisplayName);

            (await UserManager.AddLoginAsync(user, userLogin)).CheckErrors();

            await CurrentUnitOfWork.SaveChangesAsync();
        }
Exemplo n.º 5
0
 protected override async Task <WeChatOpenId> FindOpenIdAsync(string code)
 {
     return(await WeChatOpenIdFinder.FindAsync(code, Options.AppId, Options.AppSecret));
 }
        protected override async Task <WeChatOpenId> FindOpenIdAsync(string code)
        {
            var options = await WeChatOfficialOptionsFactory.CreateAsync();

            return(await WeChatOpenIdFinder.FindAsync(code, options.AppId, options.AppSecret));
        }