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)); }
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()); }
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(); }
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)); }