From 4b1a3db7b2bf1022b9d59d2add63229edafe886c Mon Sep 17 00:00:00 2001 From: MayueCif Date: Tue, 23 Jun 2026 17:24:14 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(auth):=20=E6=B7=BB=E5=8A=A0=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD=E7=9A=84=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E9=AA=8C=E8=AF=81=E7=A0=81=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 升级所有项目的目标框架从 net6.0 到 net10.0 - 在缓存键常量中添加账户删除相关的邮箱验证码前缀 - 扩展 SendEmailTypes.DeleteAccount 类型的邮件发送逻辑 - 修改 DeleteAccountCommand 命令以支持邮箱验证码参数 - 在用户服务中实现账户删除时的邮箱验证码验证 - 修复在线用户会话反序列化中的类型转换问题 - 添加对同时提供短信和邮箱验证码的冲突检查 --- .../Infrastructure/Constants/CacheKey.cs | 12 ++++++++++++ .../Masa.Auth.Contracts.Admin.csproj | 2 +- .../Masa.Auth.Domain/Masa.Auth.Domain.csproj | 2 +- ...Masa.Auth.EntityFrameworkCore.PostgreSql.csproj | 2 +- .../Masa.Auth.EntityFrameworkCore.SqlServer.csproj | 2 +- .../Masa.Auth.EntityFrameworkCore.csproj | 2 +- .../Application/Messages/CommandHandler.cs | 1 + .../Application/Subjects/CommandHandler.cs | 14 ++++++++++++++ .../Subjects/Commands/DeleteAccountCommand.cs | 2 +- .../Infrastructure/Email/EmailAgent.cs | 4 ++++ .../Masa.Auth.Service.Admin.csproj | 2 +- .../Services/OnlineUserService.cs | 2 +- .../Services/UserService.cs | 2 +- .../Masa.Auth.Security.OAuth.Providers.csproj | 4 ++-- src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj | 2 +- 15 files changed, 43 insertions(+), 12 deletions(-) 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/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/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 From 72a4f17cc4111f7ca3fa528287d28d3be575bd43 Mon Sep 17 00:00:00 2001 From: MayueCif Date: Wed, 24 Jun 2026 08:52:18 +0800 Subject: [PATCH 2/2] =?UTF-8?q?chore(docker):=20=E6=9B=B4=E6=96=B0=20Docke?= =?UTF-8?q?rfile=20=E4=BB=A5=E4=BD=BF=E7=94=A8=20.NET=2010.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将基础镜像从 .NET 6.0.403 更新到 .NET 10.0 - 替换 MASA 镜像仓库为官方 Microsoft 容器注册表 - 更新 SDK 和运行时镜像标签以匹配新版本 - 保留原有的应用程序构建和发布流程 - 确保环境变量配置保持不变 --- src/Services/Masa.Auth.Service.Admin/Dockerfile | 4 ++-- src/Web/Masa.Auth.Web.Sso/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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/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