网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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 = "操作过程中发生错误" });
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core 控制器,名为 SecurityStampMigrationController,主要用于处理与用户安全戳(SecurityStamp)相关的操作。以下是代码的主要功能和结构的详细解释:

1. 控制器概述

  • 命名空间: Dpz.Core.Auth.Controllers,表明这是一个与身份验证相关的控制器。
  • 授权: 使用 [Authorize(nameof(Permissions.System))] 特性,表示只有具有 System 权限的用户才能访问该控制器中的操作。

2. 构造函数

  • 控制器通过依赖注入接收三个服务:
    • IUserSecurityService userSecurityService: 用于处理与用户安全戳相关的操作。
    • IAccountService accountService: 用于处理与用户账户相关的操作。
    • ILogger<SecurityStampMigrationController> logger: 用于记录日志。

3. 主要操作

控制器包含多个 HTTP 操作,主要用于迁移和验证用户的安全戳。

3.1 显示迁移页面

  • 方法: Index()
  • HTTP 方法: GET
  • 路由: /security-stamp-migration
  • 功能: 返回一个视图,通常是一个迁移页面,供用户进行安全戳迁移操作。

3.2 执行安全戳迁移

  • 方法: MigrateSecurityStamps()
  • HTTP 方法: POST
  • 路由: /migrate-security-stamps
  • 功能:
    • 记录迁移开始的日志。
    • 获取所有用户的 ID。
    • 如果没有找到用户,返回一个消息。
    • 调用 BatchUpdateSecurityStampsAsync 方法批量更新用户的安全戳。
    • 记录迁移完成的日志,并返回成功更新的用户数量。
    • 如果发生异常,记录错误并返回错误消息。

3.3 验证单个用户的安全戳

  • 方法: ValidateUserSecurityStamp(string userId)
  • HTTP 方法: POST
  • 路由: /validate-user-security-stamp
  • 功能:
    • 验证传入的用户 ID 是否为空。
    • 获取用户信息并验证其安全戳的有效性。
    • 返回 JSON 格式的结果,包括验证是否成功、当前的安全戳和相应的消息。

3.4 强制单个用户重新登录

  • 方法: ForceUserReauthentication(string userId, string reason)
  • HTTP 方法: POST
  • 路由: /force-user-reauth
  • 功能:
    • 验证用户 ID 是否为空。
    • 调用 ForceUserReauthenticationAsync 方法强制用户重新登录。
    • 返回 JSON 格式的结果,指示操作是否成功。

4. 错误处理

在每个操作中,使用 try-catch 块来捕获异常并记录错误,确保在发生错误时能够返回适当的消息给用户。

总结

这个控制器的主要目的是管理用户的安全戳迁移和验证,确保用户的安全信息能够被更新和验证,以提高系统的安全性。通过提供迁移、验证和强制重新登录的功能,管理员可以有效地管理用户的安全状态。

loading