如何阻止Membership表在Identity迁移后的自动创建?
兄弟,我之前处理过不少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.MembershipSystem.Web.Security.RolesSystem.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

