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

如何阻止Membership表在Identity迁移后的自动创建?

阻止WebForms迁移到Identity后Membership表自动创建的方案

兄弟,我之前处理过不少WebForms从Membership转Identity的迁移案例,你遇到的旧表自动创建问题,核心原因是旧的Membership相关配置或代码引用还在触发ASP.NET初始化Membership提供者,按下面这几步操作就能彻底解决:

1. 彻底清理web.config里的Membership相关配置

ASP.NET会根据web.config里的<membership>、<roleManager>、<profile>这些节来初始化对应的提供者,只要这些配置存在,应用启动时就会尝试检查并创建Membership表。你需要找到这些配置并删除(或者注释掉):

比如原来的web.config里可能有类似这样的配置:

<membership defaultProvider="AspNetSqlMembershipProvider">
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/"/>
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
  <providers>
    <clear/>
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
</roleManager>
<profile defaultProvider="AspNetSqlProfileProvider">
  <providers>
    <clear/>
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
</profile>

直接把这些节点全部删除,或者用<!-- -->注释掉,确保ASP.NET不会加载Membership相关的提供者。

2. 移除项目中对Membership API的所有引用

即使配置清了,如果代码里还在调用旧的Membership相关方法(比如Membership.CreateUser、Roles.AddUserToRole、Profile.GetProfile),ASP.NET还是会触发Membership提供者的初始化,进而创建表。

你需要全局搜索项目里的这些类:

  • System.Web.Security.Membership
  • System.Web.Security.Roles
  • System.Web.Profile.ProfileBase

把所有这些旧API的调用替换成Identity的对应方法,比如:

  • 替换Membership.CreateUser为UserManager.CreateAsync
  • 替换Roles.AddUserToRole为UserManager.AddToRoleAsync
  • 替换Profile相关逻辑为Identity的Claim或者自定义的用户扩展属性

3. 确认身份验证模块完全切换到Identity

检查你的应用启动配置(比如Global.asax的Application_Start或者OWIN Startup类),确保没有启用旧的FormsAuthentication,而是完全使用Identity的身份验证机制:

比如如果是OWIN的话,Startup类里应该是类似这样的配置:

public void Configuration(IAppBuilder app)
{
    // 配置Identity
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    
    // 使用Identity的Cookie认证
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
        {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                validateInterval: TimeSpan.FromMinutes(30),
                regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
        }
    });
}

同时要确保Global.asax里没有FormsAuthentication.Initialize()这类旧的初始化代码。

4. 验证并清理缓存

修改完配置和代码后,记得:

  • 清理应用的临时文件(比如bin、obj目录,以及IIS的临时缓存)
  • 重启IIS或者应用池,确保新配置生效
  • 再次启动应用,检查数据库是否还会创建Membership表

按这几步操作下来,就能彻底阻止Membership表的自动创建了,完全符合你的合规要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:50:25