namespace Dpz.Core.Auth;

public static class AuthHelper
{
    private const string ShellViewPath = "~/Views/Shared/_Shell.cshtml";

    public const string UserVerificationRequiredMessage =
        "Passkey 未完成用户验证。请重新点击 Passkey 登录,并在浏览器弹窗中选择 Windows Hello、PIN、指纹或人脸验证;如果仍失败,请重新绑定 Passkey。";

    public const string GenericWebAuthnVerificationFailureMessage = "Passkey 验证失败,请重新开始";

    public static string ToBase64Url(byte[] source)
    {
        return Convert.ToBase64String(source).TrimEnd('=').Replace('+', '-').Replace('/', '_');
    }

    public static byte[] FromBase64Url(string source)
    {
        var value = source.Replace('-', '+').Replace('_', '/');
        return Convert.FromBase64String(
            value.PadRight(value.Length + (4 - value.Length % 4) % 4, '=')
        );
    }

    public static bool IsUserVerificationRequired(Fido2VerificationException exception) =>
        exception.Message.Contains("User Verified flag not set", StringComparison.Ordinal);

    extension(Controller controller)
    {
        public ViewResult ShellView(AuthShellViewModel model)
        {
            return controller.View(ShellViewPath, model);
        }
    }

    extension<T>(IPagedList<T> pagedList)
    {
        public ResponseResult<PagedListWarp<T>> ToPagedResult()
        {
            return ResponseResult<PagedListWarp<T>>.Ok(pagedList.ToPagedListWarp());
        }
    }

    extension<T>(ActionResult<T> result)
    {
        public ResponseResult<T> ToResponseResult()
        {
            if (result.Value is not null)
            {
                return ResponseResult<T>.Ok(result.Value);
            }

            return result.Result switch
            {
                OkObjectResult { Value: T value } => ResponseResult<T>.Ok(value),
                BadRequestObjectResult badRequest => ResponseResult<T>.Fail(
                    badRequest.Value?.ToString() ?? "上传失败"
                ),
                ObjectResult { Value: string message } => ResponseResult<T>.Fail(message),
                _ => ResponseResult<T>.Fail("上传失败"),
            };
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

AuthHelper 代码解释

这是一个位于 Dpz.Core.Auth 命名空间下的静态辅助类,主要提供身份认证相关的工具方法和扩展方法。

主要组成部分

1. 常量定义

private const string ShellViewPath = "~/Views/Shared/_Shell.cshtml";
  • 定义了一个共享视图的路径
public const string UserVerificationRequiredMessage
public const string GenericWebAuthnVerificationFailureMessage
  • 定义了两个 Passkey(WebAuthn)认证相关的错误提示消息

2. Base64Url 编码/解码方法

public static string ToBase64Url(byte[] source)
  • 将字节数组转换为 Base64Url 格式
  • 移除末尾的 = 填充字符
  • + 替换为 -/ 替换为 _
  • 这是 WebAuthn/JWT 等标准中使用的 URL 安全的 Base64 编码格式
public static byte[] FromBase64Url(string source)
  • Base64Url 解码,反向操作
  • 恢复标准 Base64 字符并添加必要的填充

3. 用户验证检查方法

public static bool IsUserVerificationRequired(Fido2VerificationException exception)
  • 检查 Fido2 异常是否因为缺少用户验证标志而失败

4. 扩展方法(Extensions)

Controller 扩展

extension(Controller controller)
{
    public ViewResult ShellView(AuthShellViewModel model)
}
  • 为 Controller 添加便捷方法,返回特定的 Shell 视图

分页列表扩展

extension<T>(IPagedList<T> pagedList)
{
    public ResponseResult<PagedListWarp<T>> ToPagedResult()
}
  • 将分页列表转换为统一的响应结果格式

ActionResult 扩展

extension<T>(ActionResult<T> result)
{
    public ResponseResult<T> ToResponseResult()
}
  • 将 ASP.NET Core 的 ActionResult<T> 转换为统一的 ResponseResult<T> 格式
  • 处理多种结果类型:
    • 直接值
    • OkObjectResult
    • BadRequestObjectResult
    • 其他 ObjectResult
  • 统一错误消息处理

应用场景

这个类主要用于:

  1. WebAuthn/Passkey 认证:提供编码转换和错误处理
  2. 统一响应格式:将不同类型的结果转换为统一的 ResponseResult 格式
  3. 视图渲染辅助:简化 Controller 中的视图返回操作
  4. 分页数据处理:标准化分页结果的返回格式
评论加载中...