Your official information source from the .NET Web Development and Tools group at Microsoft.
As you know ASP.Net SqlMembershipProvider / SqlRoleProvider only support Microsoft SQL Server and Microsoft SQL Server Express. There is no support for Microsoft SQL Azure and Microsoft SQL Server Compact. The ASP.NET Universal Providers have been created in order to add support for SQL Azure to be ready for cloud environments like Azure.
Here we will talk about how to migrate your existing project with the SqlMembershipProvider for your user accounts and passwords to the Universal Providers.
First, install the Universal Providers Nuget package. This will update the existing project to use Universal Providers. You can also migrate the existing user accounts and passwords from the SqlMembershipProvider to the Universal Providers using the instructions below.
Migrate all the accounts from the old tables to the new tables:
INSERT INTO dbo.Applications (ApplicationName, ApplicationId, Description) SELECT ApplicationName, ApplicationId, Description FROM dbo.aspnet_Applications GO INSERT INTO dbo.Roles (ApplicationId, RoleId, RoleName, Description) SELECT ApplicationId, RoleId, RoleName, Description FROM dbo.aspnet_Roles GO INSERT INTO dbo.Users (ApplicationId, UserId, UserName, IsAnonymous, LastActivityDate) SELECT ApplicationId, UserId, UserName, IsAnonymous, LastActivityDate FROM dbo.aspnet_Users GO
INSERT INTO dbo.Applications (ApplicationName, ApplicationId, Description)
SELECT ApplicationName, ApplicationId, Description FROM dbo.aspnet_Applications
GO
INSERT INTO dbo.Roles (ApplicationId, RoleId, RoleName, Description)
SELECT ApplicationId, RoleId, RoleName, Description FROM dbo.aspnet_Roles
INSERT INTO dbo.Users (ApplicationId, UserId, UserName, IsAnonymous, LastActivityDate)
SELECT ApplicationId, UserId, UserName, IsAnonymous, LastActivityDate FROM dbo.aspnet_Users
INSERT INTO dbo.Memberships (ApplicationId, UserId, Password, PasswordFormat, PasswordSalt, Email, PasswordQuestion, PasswordAnswer, IsApproved, IsLockedOut, CreateDate, LastLoginDate, LastPasswordChangedDate, LastLockoutDate, FailedPasswordAttemptCount, FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, FailedPasswordAnswerAttemptWindowStart, Comment) SELECT ApplicationId, UserId, Password, PasswordFormat, PasswordSalt, Email, PasswordQuestion, PasswordAnswer, IsApproved, IsLockedOut, CreateDate, LastLoginDate, LastPasswordChangedDate, LastLockoutDate, FailedPasswordAttemptCount, FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, FailedPasswordAnswerAttemptWindowStart, Comment FROM dbo.aspnet_Membership GO INSERT INTO dbo.UsersInRoles SELECT * FROM dbo.aspnet_UsersInRoles GO
INSERT INTO dbo.Memberships (ApplicationId, UserId, Password, PasswordFormat, PasswordSalt, Email, PasswordQuestion, PasswordAnswer, IsApproved, IsLockedOut, CreateDate, LastLoginDate, LastPasswordChangedDate, LastLockoutDate, FailedPasswordAttemptCount, FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, FailedPasswordAnswerAttemptWindowStart, Comment)
SELECT ApplicationId, UserId, Password, PasswordFormat, PasswordSalt, Email, PasswordQuestion, PasswordAnswer, IsApproved, IsLockedOut, CreateDate, LastLoginDate, LastPasswordChangedDate, LastLockoutDate, FailedPasswordAttemptCount, FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, FailedPasswordAnswerAttemptWindowStart, Comment FROM dbo.aspnet_Membership
INSERT INTO dbo.UsersInRoles SELECT * FROM dbo.aspnet_UsersInRoles
After all the accounts are migrated from the old tables to the new tables, you could update the config setting for Universal Providers (if needed) to map to the appropriate settings on the SqlMembershipProvider. In this case, a password reset won’t be needed and existing users will still be able to logon
Here is a list of the settings for SqlMembershipProvider that should be mapped to the settings on the Universal Providers DefaultMembershipProvider:
1. Default setting in membership and SqlMembershipProvider (here are 2 examples for same results of settings):
In SqlMembershipProvider, by default passwordCompatMode is Framework20.
In DefaultMembershipProvider, by default passwordCompatMode is Framework40. SqlMembershipProvider DefaultMembershipProvider e.g. e.g. <membership defaultProvider="AspNetSqlMembershipProvider"> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" /> </providers> </membership> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework20" /> </providers> </membership> <membership defaultProvider="AspNetSqlMembershipProvider"> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework20" /> </providers> </membership> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework20" /> </providers> </membership>
In DefaultMembershipProvider, by default passwordCompatMode is Framework40.
<membership defaultProvider="AspNetSqlMembershipProvider">
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" />
</providers>
</membership>
<membership defaultProvider="DefaultMembershipProvider">
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework20" />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework20" />
2. Specified hashAlgorithmType setting in membership with SqlMembershipProvider (here are 2 examples for same results of settings):
In SqlMembershipProvider, specified hashAlgorithmType will be used, no matter what passwordCompatMode.
In DefaultMembershipProvider, because of Medium trust security issue on reading hashAlgorithmType setting in membership, only when passwordCompatMode is Framework40, specified hashAlgorithmType will be used.
SqlMembershipProvider DefaultMembershipProvider e.g. e.g. <membership defaultProvider="AspNetSqlMembershipProvider" hashAlgorithmType="SHA256"> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework20" /> </providers> </membership> <membership defaultProvider="DefaultMembershipProvider" hashAlgorithmType="SHA256"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework40" /> </providers> </membership> <membership defaultProvider="AspNetSqlMembershipProvider" hashAlgorithmType="SHA256"> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework40" /> </providers> </membership> <membership defaultProvider="DefaultMembershipProvider" hashAlgorithmType="SHA256"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework40" /> </providers> </membership>
<membership defaultProvider="AspNetSqlMembershipProvider" hashAlgorithmType="SHA256">
<membership defaultProvider="DefaultMembershipProvider" hashAlgorithmType="SHA256">
<add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework40" />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework40" />
3. Specified Framework40 passwordCompatMode in SqlMembershipProvider:
SqlMembershipProvider DefaultMembershipProvider e.g. e.g. <membership defaultProvider="AspNetSqlMembershipProvider"> <providers> <clear /> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" applicationName="test" passwordCompatMode="Framework40" /> </providers> </membership> <membership defaultProvider="DefaultMembershipProvider"> <providers> <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider" connectionStringName="DefaultConnection" applicationName="test" passwordCompatMode="Framework40" /> </providers> </membership>
Why the schema "dbo" is used for the new tables. What if a current database, based on the old provider has already such tables, like Roles, Users?