网站首页 网站源码
using Dpz.Core.EnumLibrary;
using Dpz.Core.Service.RepositoryService;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Dpz.Core.Auth.Controllers;
/// <summary>
/// SecurityStamp迁移控制器
/// 用于将现有用户的SecurityStamp更新为新的安全格式
/// </summary>
[Authorize(nameof(Permissions.System))]
public class SecurityStampMigrationController(
IUserSecurityService userSecurityService,
IAccountService accountService,
ILogger<SecurityStampMigrationController> logger
) : Controller
{
/// <summary>
/// 显示迁移页面
/// </summary>
[HttpGet]
[Route("security-stamp-migration")]
public IActionResult Index()
{
return View();
}
/// <summary>
/// 执行SecurityStamp迁移
/// 将所有用户的SecurityStamp更新为新的安全格式
/// </summary>
[HttpPost]
[Route("migrate-security-stamps")]
public async Task<IActionResult> MigrateSecurityStamps()
{
try
{
logger.LogInformation("开始执行SecurityStamp迁移操作");
// 获取所有用户ID
var allUsers = await accountService.GetPageAsync(1, 10000);
var userIds = allUsers.Select(u => u.Id).ToList();
if (!userIds.Any())
{
TempData["Message"] = "没有找到需要迁移的用户";
return RedirectToAction("Index");
}
// 批量更新SecurityStamp
var successCount = await userSecurityService.BatchUpdateSecurityStampsAsync(
userIds,
"系统升级:SecurityStamp格式迁移"
);
var message = $"SecurityStamp迁移完成!成功更新 {successCount}/{userIds.Count} 个用户";
TempData["Message"] = message;
logger.LogInformation(
"SecurityStamp迁移完成,成功更新 {SuccessCount}/{TotalCount} 个用户",
successCount,
userIds.Count
);
return RedirectToAction("Index");
}
catch (Exception ex)
{
logger.LogError(ex, "执行SecurityStamp迁移时发生错误");
TempData["Error"] = "迁移过程中发生错误,请查看日志获取详细信息";
return RedirectToAction("Index");
}
}
/// <summary>
/// 验证单个用户的SecurityStamp
/// </summary>
[HttpPost]
[Route("validate-user-security-stamp")]
public async Task<IActionResult> ValidateUserSecurityStamp(string userId)
{
if (string.IsNullOrWhiteSpace(userId))
{
return Json(new { success = false, message = "用户ID不能为空" });
}
try
{
var user = await accountService.GetOneUserAsync(userId);
if (user == null)
{
return Json(new { success = false, message = "用户不存在" });
}
var isValid = await userSecurityService.ValidateUserSecurityStampAsync(
userId,
user.Key
);
return Json(
new
{
success = true,
isValid,
currentKey = user.Key,
message = isValid ? "SecurityStamp格式有效" : "SecurityStamp格式无效,建议更新",
}
);
}
catch (Exception ex)
{
logger.LogError(ex, "验证用户 {UserId} 的SecurityStamp时发生错误", userId);
return Json(new { success = false, message = "验证过程中发生错误" });
}
}
/// <summary>
/// 强制单个用户重新登录
/// </summary>
[HttpPost]
[Route("force-user-reauth")]
public async Task<IActionResult> ForceUserReauthentication(
string userId,
string reason = "管理员操作"
)
{
if (string.IsNullOrWhiteSpace(userId))
{
return Json(new { success = false, message = "用户ID不能为空" });
}
try
{
var success = await userSecurityService.ForceUserReauthenticationAsync(userId, reason);
return Json(new { success, message = success ? "已强制用户重新登录" : "操作失败" });
}
catch (Exception ex)
{
logger.LogError(ex, "强制用户 {UserId} 重新登录时发生错误", userId);
return Json(new { success = false, message = "操作过程中发生错误" });
}
}
}
上述代码是一个 ASP.NET Core 控制器,名为 SecurityStampMigrationController,主要用于处理与用户安全戳(SecurityStamp)相关的操作。以下是代码的主要功能和结构的详细解释:
Dpz.Core.Auth.Controllers,表明这是一个与身份验证相关的控制器。[Authorize(nameof(Permissions.System))] 特性,表示只有具有 System 权限的用户才能访问该控制器中的操作。IUserSecurityService userSecurityService: 用于处理与用户安全戳相关的操作。IAccountService accountService: 用于处理与用户账户相关的操作。ILogger<SecurityStampMigrationController> logger: 用于记录日志。控制器包含多个 HTTP 操作,主要用于迁移和验证用户的安全戳。
Index()/security-stamp-migrationMigrateSecurityStamps()/migrate-security-stampsBatchUpdateSecurityStampsAsync 方法批量更新用户的安全戳。ValidateUserSecurityStamp(string userId)/validate-user-security-stampForceUserReauthentication(string userId, string reason)/force-user-reauthForceUserReauthenticationAsync 方法强制用户重新登录。在每个操作中,使用 try-catch 块来捕获异常并记录错误,确保在发生错误时能够返回适当的消息给用户。
这个控制器的主要目的是管理用户的安全戳迁移和验证,确保用户的安全信息能够被更新和验证,以提高系统的安全性。通过提供迁移、验证和强制重新登录的功能,管理员可以有效地管理用户的安全状态。
