4 changed files with 107 additions and 108 deletions
@ -1,104 +1,103 @@ |
|||||
using Microsoft.AspNetCore.Authorization; |
using Microsoft.AspNetCore.Authorization; |
||||
using Microsoft.AspNetCore.Identity; |
using Microsoft.AspNetCore.Identity; |
||||
using Microsoft.Extensions.Caching.Distributed; |
using Microsoft.Extensions.Caching.Distributed; |
||||
using Microsoft.Extensions.Options; |
using Microsoft.Extensions.Options; |
||||
using System; |
using System; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
using Volo.Abp; |
using Volo.Abp; |
||||
using Volo.Abp.Caching; |
using Volo.Abp.Caching; |
||||
using Volo.Abp.Identity; |
using Volo.Abp.Identity; |
||||
using Volo.Abp.Identity.Settings; |
using Volo.Abp.Settings; |
||||
using Volo.Abp.Settings; |
using Volo.Abp.Users; |
||||
using Volo.Abp.Users; |
|
||||
|
namespace LINGYUN.Abp.Identity |
||||
namespace LINGYUN.Abp.Identity |
{ |
||||
{ |
[Authorize] |
||||
[Authorize] |
public class MyProfileAppService : IdentityAppServiceBase, IMyProfileAppService |
||||
public class MyProfileAppService : IdentityAppServiceBase, IMyProfileAppService |
{ |
||||
{ |
protected IDistributedCache<SmsSecurityTokenCacheItem> SecurityTokenCache { get; } |
||||
protected IDistributedCache<SmsSecurityTokenCacheItem> SecurityTokenCache { get; } |
protected IUserSecurityCodeSender SecurityCodeSender { get; } |
||||
protected IUserSecurityCodeSender SecurityCodeSender { get; } |
protected IdentityUserManager UserManager { get; } |
||||
protected IdentityUserManager UserManager { get; } |
protected IIdentityUserRepository UserRepository { get; } |
||||
protected IIdentityUserRepository UserRepository { get; } |
protected IOptions<IdentityOptions> IdentityOptions { get; } |
||||
protected IOptions<IdentityOptions> IdentityOptions { get; } |
|
||||
|
public MyProfileAppService( |
||||
public MyProfileAppService( |
IdentityUserManager userManager, |
||||
IdentityUserManager userManager, |
IIdentityUserRepository userRepository, |
||||
IIdentityUserRepository userRepository, |
IUserSecurityCodeSender securityCodeSender, |
||||
IUserSecurityCodeSender securityCodeSender, |
IOptions<IdentityOptions> identityOptions, |
||||
IOptions<IdentityOptions> identityOptions, |
IDistributedCache<SmsSecurityTokenCacheItem> securityTokenCache) |
||||
IDistributedCache<SmsSecurityTokenCacheItem> securityTokenCache) |
{ |
||||
{ |
UserManager = userManager; |
||||
UserManager = userManager; |
UserRepository = userRepository; |
||||
UserRepository = userRepository; |
IdentityOptions = identityOptions; |
||||
IdentityOptions = identityOptions; |
SecurityCodeSender = securityCodeSender; |
||||
SecurityCodeSender = securityCodeSender; |
SecurityTokenCache = securityTokenCache; |
||||
SecurityTokenCache = securityTokenCache; |
} |
||||
} |
|
||||
|
public virtual async Task ChangeTwoFactorEnabledAsync(ChangeTwoFactorEnabledDto input) |
||||
public virtual async Task ChangeTwoFactorEnabledAsync(ChangeTwoFactorEnabledDto input) |
{ |
||||
{ |
// Removed See: https://github.com/abpframework/abp/pull/7719
|
||||
// Removed See: https://github.com/abpframework/abp/pull/7719
|
//if (!await SettingProvider.IsTrueAsync(IdentitySettingNames.TwoFactor.UsersCanChange))
|
||||
//if (!await SettingProvider.IsTrueAsync(IdentitySettingNames.TwoFactor.UsersCanChange))
|
//{
|
||||
//{
|
// throw new BusinessException(Volo.Abp.Identity.IdentityErrorCodes.CanNotChangeTwoFactor);
|
||||
// throw new BusinessException(Volo.Abp.Identity.IdentityErrorCodes.CanNotChangeTwoFactor);
|
//}
|
||||
//}
|
// TODO: Abp官方移除了双因素的设置,不排除以后会增加,如果在用户接口中启用了双因素认证,可能造成登录失败!
|
||||
// TODO: Abp官方移除了双因素的设置,不排除以后会增加,如果在用户接口中启用了双因素认证,可能造成登录失败!
|
await IdentityOptions.SetAsync(); |
||||
await IdentityOptions.SetAsync(); |
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
||||
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
|
||||
|
(await UserManager.SetTwoFactorEnabledWithAccountConfirmedAsync(user, input.Enabled)).CheckErrors(); |
||||
(await UserManager.SetTwoFactorEnabledWithAccountConfirmedAsync(user, input.Enabled)).CheckErrors(); |
|
||||
|
await CurrentUnitOfWork.SaveChangesAsync(); |
||||
await CurrentUnitOfWork.SaveChangesAsync(); |
} |
||||
} |
|
||||
|
public virtual async Task SendChangePhoneNumberCodeAsync(SendChangePhoneNumberCodeDto input) |
||||
public virtual async Task SendChangePhoneNumberCodeAsync(SendChangePhoneNumberCodeDto input) |
{ |
||||
{ |
var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); |
||||
var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); |
var securityTokenCacheItem = await SecurityTokenCache.GetAsync(securityTokenCacheKey); |
||||
var securityTokenCacheItem = await SecurityTokenCache.GetAsync(securityTokenCacheKey); |
var interval = await SettingProvider.GetAsync(Settings.IdentitySettingNames.User.SmsRepetInterval, 1); |
||||
var interval = await SettingProvider.GetAsync(Settings.IdentitySettingNames.User.SmsRepetInterval, 1); |
if (securityTokenCacheItem != null) |
||||
if (securityTokenCacheItem != null) |
{ |
||||
{ |
throw new UserFriendlyException(L["SendRepeatPhoneVerifyCode", interval]); |
||||
throw new UserFriendlyException(L["SendRepeatPhoneVerifyCode", interval]); |
} |
||||
} |
|
||||
|
// 是否已有用户使用手机号绑定
|
||||
// 是否已有用户使用手机号绑定
|
if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) |
||||
if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) |
{ |
||||
{ |
throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); |
||||
throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); |
} |
||||
} |
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
||||
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
var template = await SettingProvider.GetOrNullAsync(Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed); |
||||
var template = await SettingProvider.GetOrNullAsync(Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed); |
var token = await UserManager.GenerateChangePhoneNumberTokenAsync(user, input.NewPhoneNumber); |
||||
var token = await UserManager.GenerateChangePhoneNumberTokenAsync(user, input.NewPhoneNumber); |
// 发送验证码
|
||||
// 发送验证码
|
await SecurityCodeSender.SendPhoneConfirmedCodeAsync(input.NewPhoneNumber, token, template); |
||||
await SecurityCodeSender.SendPhoneConfirmedCodeAsync(input.NewPhoneNumber, token, template); |
|
||||
|
securityTokenCacheItem = new SmsSecurityTokenCacheItem(token, user.ConcurrencyStamp); |
||||
securityTokenCacheItem = new SmsSecurityTokenCacheItem(token, user.ConcurrencyStamp); |
await SecurityTokenCache |
||||
await SecurityTokenCache |
.SetAsync(securityTokenCacheKey, securityTokenCacheItem, |
||||
.SetAsync(securityTokenCacheKey, securityTokenCacheItem, |
new DistributedCacheEntryOptions |
||||
new DistributedCacheEntryOptions |
{ |
||||
{ |
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(interval) |
||||
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(interval) |
}); |
||||
}); |
} |
||||
} |
|
||||
|
public virtual async Task ChangePhoneNumberAsync(ChangePhoneNumberDto input) |
||||
public virtual async Task ChangePhoneNumberAsync(ChangePhoneNumberDto input) |
{ |
||||
{ |
// 是否已有用户使用手机号绑定
|
||||
// 是否已有用户使用手机号绑定
|
if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) |
||||
if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber)) |
{ |
||||
{ |
throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); |
||||
throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber); |
} |
||||
} |
await IdentityOptions.SetAsync(); |
||||
await IdentityOptions.SetAsync(); |
//TODO: 可以查询缓存用 securityTokenCacheItem.SecurityToken 与 user.SecurityStamp 作对比
|
||||
//TODO: 可以查询缓存用 securityTokenCacheItem.SecurityToken 与 user.SecurityStamp 作对比
|
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
||||
var user = await UserManager.GetByIdAsync(CurrentUser.GetId()); |
// 更换手机号
|
||||
// 更换手机号
|
(await UserManager.ChangePhoneNumberAsync(user, input.NewPhoneNumber, input.Code)).CheckErrors(); |
||||
(await UserManager.ChangePhoneNumberAsync(user, input.NewPhoneNumber, input.Code)).CheckErrors(); |
|
||||
|
await CurrentUnitOfWork.SaveChangesAsync(); |
||||
await CurrentUnitOfWork.SaveChangesAsync(); |
|
||||
|
var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); |
||||
var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber"); |
await SecurityTokenCache.RemoveAsync(securityTokenCacheKey); |
||||
await SecurityTokenCache.RemoveAsync(securityTokenCacheKey); |
} |
||||
} |
} |
||||
} |
} |
||||
} |
|
||||
|
|||||
Loading…
Reference in new issue