You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Webforms的FormsAuthentication迁移到Blazor方案咨询

ASP.NET Webforms 升级 Blazor 最优路径及 Forms 认证用户数据复用方案

整体升级路径

  • 优先采用绞杀者迁移模式,不做一次性全量重构,最大程度降低升级风险:先保留原 Webforms 站点正常运行,通过 IIS 反向代理配置路由规则,旧业务路径走原站点,新开发/迁移的页面走 Blazor 站点,逐步替换所有页面后再下线原 Webforms 站点。
  • 升级优先顺序建议:非核心公共页面 → 业务子模块 → 核心用户模块,用户认证体系的适配提前到第一个迁移阶段完成,避免后续重复改造。

现有 SQL Forms 认证用户数据复用方案

原 Webforms 使用的 SQL Membership 表结构的密码哈希规则完全公开,无需用户重置密码即可直接复用,步骤如下:

1. 数据库层兼容

无需改动原有 aspnet_Users、aspnet_Membership 等系统表结构,Blazor 站点直接配置连接字符串指向原有业务数据库即可,避免影响旧站点运行。

2. 自定义密码验证逻辑

Blazor 默认使用 ASP.NET Core Identity 认证体系,你需要重写密码哈希验证器,匹配旧 Forms 认证的哈希规则:

旧 Membership 默认采用 SHA1(盐值 + 明文密码) 的哈希逻辑,哈希结果和盐值分别存在 aspnet_Membership 表的 Password 和 PasswordSalt 字段。

自定义密码哈希器示例代码:

public class LegacyMembershipPasswordHasher<TUser> : IPasswordHasher<TUser> where TUser : IdentityUser
{
    public string HashPassword(TUser user, string password)
    {
        // 新用户注册可按需沿用旧哈希规则,或切换为ASP.NET Core默认的更强哈希算法
        throw new NotImplementedException("新用户注册逻辑自行实现即可");
    }

    public PasswordVerificationResult VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword)
    {
        // 获取对应用户的旧盐值
        var salt = GetUserSaltFromLegacyTable(user.Id);
        byte[] saltBytes = Convert.FromBase64String(salt);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(providedPassword);
        byte[] combinedBytes = saltBytes.Concat(passwordBytes).ToArray();
        byte[] computedHash = SHA1.Create().ComputeHash(combinedBytes);
        string computedHashStr = Convert.ToBase64String(computedHash);

        return computedHashStr == hashedPassword ? PasswordVerificationResult.Success : PasswordVerificationResult.Failed;
    }

    // 从旧Membership表查询用户盐值
    private string GetUserSaltFromLegacyTable(string userId)
    {
        using var dbConn = new SqlConnection("原有业务数据库连接字符串");
        return dbConn.QueryFirstOrDefault<string>(
            "SELECT PasswordSalt FROM aspnet_Membership WHERE UserId = @UserId", 
            new { UserId = Guid.Parse(userId) }
        );
    }
}

3. 替换默认认证服务

在 Program.cs 中注册自定义密码哈希器,替换 Identity 默认实现:

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddPasswordHasher<LegacyMembershipPasswordHasher<IdentityUser>>();

可选优化

如果希望后续不再依赖旧 Membership 表,可以写一次性脚本将用户数据同步到 ASP.NET Core Identity 默认的 AspNetUsers 表,新增扩展字段存储旧密码哈希和盐值即可,验证逻辑无需改动。如果需要实现新旧站点单点登录,只需配置 Blazor 站点的 Cookie 名称、加密密钥、域名和原 Webforms 站点保持一致,用户无需重新登录即可访问新站点。

内容的提问来源于stack exchange,提问作者Yaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:10