public virtual async Task SendChangePhoneNumberCodeAsync(SendChangePhoneNumberCodeDto input) { var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); var securityTokenCacheItem = await SecurityTokenCache.GetAsync(securityTokenCacheKey); var interval = await SettingProvider.GetAsync(Settings.IdentitySettingNames.User.SmsRepetInterval, 1); if (securityTokenCacheItem != null) { throw new UserFriendlyException(L["SendRepeatPhoneVerifyCode", interval]); } // 是否已有用户使用手机号绑定 if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) { throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); } var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); var template = await SettingProvider.GetOrNullAsync(Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed); var token = await UserManager.GenerateChangePhoneNumberTokenAsync(user, input.NewPhoneNumber); // 发送验证码 await SecurityCodeSender.SendPhoneConfirmedCodeAsync(input.NewPhoneNumber, token, template); securityTokenCacheItem = new SmsSecurityTokenCacheItem(token, user.ConcurrencyStamp); await SecurityTokenCache .SetAsync(securityTokenCacheKey, securityTokenCacheItem, new DistributedCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(interval) }); }
public virtual async Task ChangePhoneNumberAsync(ChangePhoneNumberDto input) { // 是否已有用户使用手机号绑定 if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) { throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); } //TODO: 可以查询缓存用 securityTokenCacheItem.SecurityToken 与 user.SecurityStamp 作对比 var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); // 更换手机号 (await UserManager.ChangePhoneNumberAsync(user, input.NewPhoneNumber, input.Code)).CheckErrors(); await CurrentUnitOfWork.SaveChangesAsync(); var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); await SecurityTokenCache.RemoveAsync(securityTokenCacheKey); }