diff --git a/src/Contracts/Masa.Auth.Contracts.Admin/Infrastructure/Constants/CacheKey.cs b/src/Contracts/Masa.Auth.Contracts.Admin/Infrastructure/Constants/CacheKey.cs index 1b8a801e..705b2223 100644 --- a/src/Contracts/Masa.Auth.Contracts.Admin/Infrastructure/Constants/CacheKey.cs +++ b/src/Contracts/Masa.Auth.Contracts.Admin/Infrastructure/Constants/CacheKey.cs @@ -29,6 +29,8 @@ public static class CacheKey const string EMAIL_FORGOT_PASSWORD_SEND_PRE = "email_forgot_password_send:"; const string MSG_CODE_FORGOT_PASSWORD_CODE_PRE = "msg_forgot_password_code:"; const string MSG_CODE_FORGOT_PASSWORD_SEND_PRE = "msg_forgot_password_send:"; + const string EMAIL_DELETE_ACCOUNT_CODE_PRE = "email_delete_account_code:"; + const string EMAIL_DELETE_ACCOUNT_SEND_PRE = "email_delete_account_send:"; const string EMAIL_UPDATE_CODE_PRE = "email_update_code:"; const string EMAIL_UPDATE_SEND_PRE = "email_update_send:"; public const string STAFF_DEFAULT_PASSWORD = "staff_default_password"; @@ -130,6 +132,16 @@ public static string EmailCodeForgotPasswordKey(string email) return $"{EMAIL_FORGOT_PASSWORD_CODE_PRE}{email}"; } + public static string EmailCodeDeleteAccountSendKey(string email) + { + return $"{EMAIL_DELETE_ACCOUNT_SEND_PRE}{email}"; + } + + public static string EmailCodeDeleteAccountKey(string email) + { + return $"{EMAIL_DELETE_ACCOUNT_CODE_PRE}{email}"; + } + public static string EmailCodeUpdateSendKey(string email) { return $"{EMAIL_UPDATE_SEND_PRE}{email}"; diff --git a/src/Contracts/Masa.Auth.Contracts.Admin/Masa.Auth.Contracts.Admin.csproj b/src/Contracts/Masa.Auth.Contracts.Admin/Masa.Auth.Contracts.Admin.csproj index 84ce735e..441f5f0c 100644 --- a/src/Contracts/Masa.Auth.Contracts.Admin/Masa.Auth.Contracts.Admin.csproj +++ b/src/Contracts/Masa.Auth.Contracts.Admin/Masa.Auth.Contracts.Admin.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/Domain/Masa.Auth.Domain/Masa.Auth.Domain.csproj b/src/Domain/Masa.Auth.Domain/Masa.Auth.Domain.csproj index 1338d3fc..7de0e83b 100644 --- a/src/Domain/Masa.Auth.Domain/Masa.Auth.Domain.csproj +++ b/src/Domain/Masa.Auth.Domain/Masa.Auth.Domain.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/Infrastructure/Masa.Auth.EntityFrameworkCore.PostgreSql/Masa.Auth.EntityFrameworkCore.PostgreSql.csproj b/src/Infrastructure/Masa.Auth.EntityFrameworkCore.PostgreSql/Masa.Auth.EntityFrameworkCore.PostgreSql.csproj index 1313f33b..6f861aaa 100644 --- a/src/Infrastructure/Masa.Auth.EntityFrameworkCore.PostgreSql/Masa.Auth.EntityFrameworkCore.PostgreSql.csproj +++ b/src/Infrastructure/Masa.Auth.EntityFrameworkCore.PostgreSql/Masa.Auth.EntityFrameworkCore.PostgreSql.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/Infrastructure/Masa.Auth.EntityFrameworkCore.SqlServer/Masa.Auth.EntityFrameworkCore.SqlServer.csproj b/src/Infrastructure/Masa.Auth.EntityFrameworkCore.SqlServer/Masa.Auth.EntityFrameworkCore.SqlServer.csproj index 8fc24756..26f9202e 100644 --- a/src/Infrastructure/Masa.Auth.EntityFrameworkCore.SqlServer/Masa.Auth.EntityFrameworkCore.SqlServer.csproj +++ b/src/Infrastructure/Masa.Auth.EntityFrameworkCore.SqlServer/Masa.Auth.EntityFrameworkCore.SqlServer.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/Infrastructure/Masa.Auth.EntityFrameworkCore/Masa.Auth.EntityFrameworkCore.csproj b/src/Infrastructure/Masa.Auth.EntityFrameworkCore/Masa.Auth.EntityFrameworkCore.csproj index f3c31a16..f8e4dddc 100644 --- a/src/Infrastructure/Masa.Auth.EntityFrameworkCore/Masa.Auth.EntityFrameworkCore.csproj +++ b/src/Infrastructure/Masa.Auth.EntityFrameworkCore/Masa.Auth.EntityFrameworkCore.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/Services/Masa.Auth.Service.Admin/Application/Messages/CommandHandler.cs b/src/Services/Masa.Auth.Service.Admin/Application/Messages/CommandHandler.cs index 30007dcf..dcdfbca0 100644 --- a/src/Services/Masa.Auth.Service.Admin/Application/Messages/CommandHandler.cs +++ b/src/Services/Masa.Auth.Service.Admin/Application/Messages/CommandHandler.cs @@ -88,6 +88,7 @@ public async Task SendEmailAsync(SendEmailCommand command) case SendEmailTypes.Verifiy: case SendEmailTypes.UpdateEmail: case SendEmailTypes.ForgotPassword: + case SendEmailTypes.DeleteAccount: if (!_userRepository.Any(u => u.Email == model.Email)) { throw new UserFriendlyException(UserFriendlyExceptionCodes.USER_EMAIL_NOT_EXIST, model.Email); diff --git a/src/Services/Masa.Auth.Service.Admin/Application/Subjects/CommandHandler.cs b/src/Services/Masa.Auth.Service.Admin/Application/Subjects/CommandHandler.cs index e6c090d7..82fe2265 100644 --- a/src/Services/Masa.Auth.Service.Admin/Application/Subjects/CommandHandler.cs +++ b/src/Services/Masa.Auth.Service.Admin/Application/Subjects/CommandHandler.cs @@ -714,6 +714,11 @@ public async Task DeleteAccountAsync(DeleteAccountCommand command) throw new UserFriendlyException(errorCode: UserFriendlyExceptionCodes.USER_NOT_EXIST); } + if (command.SmsCode is not null && command.EmailCode is not null) + { + throw new UserFriendlyException(errorCode: UserFriendlyExceptionCodes.INVALID_CAPTCHA); + } + if (command.SmsCode is not null) { var smsCodeKey = CacheKey.MsgCodeDeleteAccountKey(user.PhoneNumber); @@ -723,6 +728,15 @@ public async Task DeleteAccountAsync(DeleteAccountCommand command) throw new UserFriendlyException(errorCode: UserFriendlyExceptionCodes.INVALID_SMS_CAPTCHA); } } + else if (command.EmailCode is not null) + { + var emailCodeKey = CacheKey.EmailCodeDeleteAccountKey(user.Email); + var emailCode = await _distributedCacheClient.GetAsync(emailCodeKey); + if (!command.EmailCode.Equals(emailCode)) + { + throw new UserFriendlyException(errorCode: UserFriendlyExceptionCodes.INVALID_EMAIL_CAPTCHA); + } + } await _userDomainService.RemoveAsync(user.Id); } diff --git a/src/Services/Masa.Auth.Service.Admin/Application/Subjects/Commands/DeleteAccountCommand.cs b/src/Services/Masa.Auth.Service.Admin/Application/Subjects/Commands/DeleteAccountCommand.cs index a870ffae..b574038f 100644 --- a/src/Services/Masa.Auth.Service.Admin/Application/Subjects/Commands/DeleteAccountCommand.cs +++ b/src/Services/Masa.Auth.Service.Admin/Application/Subjects/Commands/DeleteAccountCommand.cs @@ -3,6 +3,6 @@ namespace Masa.Auth.Service.Admin.Application.Subjects.Commands; -public record DeleteAccountCommand(string? SmsCode) : Command +public record DeleteAccountCommand(string? SmsCode, string? EmailCode) : Command { } diff --git a/src/Services/Masa.Auth.Service.Admin/Dockerfile b/src/Services/Masa.Auth.Service.Admin/Dockerfile index ca112314..fcebb525 100644 --- a/src/Services/Masa.Auth.Service.Admin/Dockerfile +++ b/src/Services/Masa.Auth.Service.Admin/Dockerfile @@ -1,13 +1,13 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM registry.cn-hangzhou.aliyuncs.com/masa/dotnet_sdk:6.0.403 AS publish +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS publish WORKDIR /src COPY . . ENV CSPROJ="src/Services/Masa.Auth.Service.Admin/Masa.Auth.Service.Admin.csproj" RUN dotnet restore $CSPROJ && dotnet publish $CSPROJ -c Release -o /app/publish -FROM registry.cn-hangzhou.aliyuncs.com/masa/dotnet_aspnet:6.0.4 +FROM mcr.microsoft.com/dotnet/aspnet:10.0 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS=http://0.0.0.0:80 diff --git a/src/Services/Masa.Auth.Service.Admin/Infrastructure/Email/EmailAgent.cs b/src/Services/Masa.Auth.Service.Admin/Infrastructure/Email/EmailAgent.cs index ec08247d..7aa29cfa 100644 --- a/src/Services/Masa.Auth.Service.Admin/Infrastructure/Email/EmailAgent.cs +++ b/src/Services/Masa.Auth.Service.Admin/Infrastructure/Email/EmailAgent.cs @@ -47,6 +47,10 @@ public async Task SendEmailAsync(SendEmailModel sendEmailModel, TimeSpan? expira sendKey = CacheKey.EmailCodeBindSendKey(sendEmailModel.Email); sendValueKey = CacheKey.EmailCodeBindKey(sendEmailModel.Email); break; + case SendEmailTypes.DeleteAccount: + sendKey = CacheKey.EmailCodeDeleteAccountSendKey(sendEmailModel.Email); + sendValueKey = CacheKey.EmailCodeDeleteAccountKey(sendEmailModel.Email); + break; default: break; } diff --git a/src/Services/Masa.Auth.Service.Admin/Masa.Auth.Service.Admin.csproj b/src/Services/Masa.Auth.Service.Admin/Masa.Auth.Service.Admin.csproj index 0d05720a..cc4ac6e8 100644 --- a/src/Services/Masa.Auth.Service.Admin/Masa.Auth.Service.Admin.csproj +++ b/src/Services/Masa.Auth.Service.Admin/Masa.Auth.Service.Admin.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable 6efa3c5e-9868-4abd-90a1-75aca8b7b38f diff --git a/src/Services/Masa.Auth.Service.Admin/Services/OnlineUserService.cs b/src/Services/Masa.Auth.Service.Admin/Services/OnlineUserService.cs index d2d54020..a007422e 100644 --- a/src/Services/Masa.Auth.Service.Admin/Services/OnlineUserService.cs +++ b/src/Services/Masa.Auth.Service.Admin/Services/OnlineUserService.cs @@ -42,7 +42,7 @@ public async Task> GetListAsync( var sessionJson = await db.StringGetAsync(SsoSessionKey(subjectId)); if (sessionJson.HasValue) { - var session = JsonSerializer.Deserialize(sessionJson!); + var session = JsonSerializer.Deserialize((string)sessionJson!); if (session != null) webSessions[subjectId] = new WebSessionDto(session.LoginTime, session.ClientId); } diff --git a/src/Services/Masa.Auth.Service.Admin/Services/UserService.cs b/src/Services/Masa.Auth.Service.Admin/Services/UserService.cs index c9089819..430cd44a 100644 --- a/src/Services/Masa.Auth.Service.Admin/Services/UserService.cs +++ b/src/Services/Masa.Auth.Service.Admin/Services/UserService.cs @@ -434,7 +434,7 @@ public async Task GetImpersonatedAsync([FromServices] IE [RoutePattern("account/delete", StartWithBaseUri = true, HttpMethod = "Post")] public async Task DeleteAccountAsync([FromServices] IEventBus eventBus, [FromBody] DeleteAccountModel model) { - var command = new DeleteAccountCommand(model.SmsCode); + var command = new DeleteAccountCommand(model.SmsCode, model.EmailCode); await eventBus.PublishAsync(command); } diff --git a/src/Web/Masa.Auth.Security.OAuth.Providers/Masa.Auth.Security.OAuth.Providers.csproj b/src/Web/Masa.Auth.Security.OAuth.Providers/Masa.Auth.Security.OAuth.Providers.csproj index 1f0e020b..c95cedbb 100644 --- a/src/Web/Masa.Auth.Security.OAuth.Providers/Masa.Auth.Security.OAuth.Providers.csproj +++ b/src/Web/Masa.Auth.Security.OAuth.Providers/Masa.Auth.Security.OAuth.Providers.csproj @@ -1,7 +1,7 @@ - + - net6.0 + net10.0 enable enable diff --git a/src/Web/Masa.Auth.Web.Sso/Dockerfile b/src/Web/Masa.Auth.Web.Sso/Dockerfile index be0455e4..0a32f569 100644 --- a/src/Web/Masa.Auth.Web.Sso/Dockerfile +++ b/src/Web/Masa.Auth.Web.Sso/Dockerfile @@ -1,10 +1,10 @@ -FROM registry.cn-hangzhou.aliyuncs.com/masa/dotnet_sdk:6.0.403 AS publish +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS publish WORKDIR /src COPY . . ENV CSPROJ="src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj" RUN dotnet restore $CSPROJ && dotnet publish $CSPROJ -c Release -o /app/publish -FROM registry.cn-hangzhou.aliyuncs.com/masa/dotnet_aspnet:6.0.4 +FROM mcr.microsoft.com/dotnet/aspnet:10.0 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS=https://0.0.0.0:443 diff --git a/src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj b/src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj index e56021cb..7ba6d7ee 100644 --- a/src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj +++ b/src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable false