How do I stop using ASPNETDB.MDF in LocalDB? - asp.net

I implemented ASP.NET Identity and it automatically created ASPNETDB.MDF and aspnetdb_log.ldf in my App_Data folder. I already have the AspNet tables (i.e., AspNetRoles, AspNetUsers, etc) in my SQL Express instance (which is where all my other tables are sitting). As far as I can see, my application is reading and writing membership and role data from the SQL Express database and not ASPNETDB.MDF.
I have set my connectionString in web.config to:
<add name="DefaultConnection" connectionString="Data Source=MyComputerName\SQLEXPRESS;Initial Catalog=MyDatabaseName;Integrated Security=True" providerName="System.Data.SqlClient" />
However, if I remove ASPNETDB.MDF from App_Data, I get the following error when I login:
Exception Details: System.Data.SqlClient.SqlException: One or more files do not match the primary file of the database. If you are attempting to attach a database, retry the operation with the correct files. If this is an existing database, the file may be corrupted and should be restored from a backup.
Cannot open user default database. Login failed.
Login failed for user 'MyComputerName\MyUserName'.
Log file 'C:\Users\MyProjectName\App_Data\aspnetdb_log.ldf' does not match the primary file. It may be from a different database or the log may have been rebuilt previously
The error goes away once I add ASPNETDB.MDF back to App_Data.
I have searched all the code in my solution and it makes no reference to ASPNETDB. So why is it still trying to read from it?
I am developing ASP.NET web forms on .Net 4.5.

I was getting exactly the same problem. I discovered that VS annoyingly pulls in config settings from machine.config, which lives outside of the project, in my case in...
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
Identity 2.0 had used the following connection string inside machine.config...
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
to set up a connection for...
<membership>
<providers>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, ........" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers>
</membership>
.. (which was also set in machine.config). If you haven't been using Membership then it's fine to do as Lord nick suggests (except just the clear/ will do the job) and simply do the following in web.config...
<connectionStrings>
<clear/>
<add name="DefaultConnection" connectionString="whatever" providerName="System.Data.SqlClient" />
However, if you, like me, previously had Membership running (https://msdn.microsoft.com/en-us/library/6e9y4s5t(v=vs.100).aspx), you will need to comment out or delete the following sections from machine.config...
<!--
<membership>
<providers>
...
</providers>
</membership>
<profile>
<providers>
...
</providers>
</profile>
<roleManager>
<providers>
..
</providers>
</roleManager>
-->
... since all this stuff is no longer needed for AspNet Identity 2.
I also had to add the following into in my web.config:
<modules>
<remove name="RoleManager"/>
</modules>
... as per this answer: Default Role Provider could not be found on IIS 7 running .NET 4
I hope I've saved someone some time. This took me hours and hours to work out.

I had the same Problem where the ASPNETDB.MDF was automatically created, even if I use Asp.Net Identity as the main user management.
I solved it by removing the following line from web.config:
<roleManager enabled="true" />
This one tells ASP.NET to use the older ASP.NET Membership user management, which is not supported by ASP.NET Identity.

It seems you have something like in your web.config
<add name="DefaultConnectionForLocalDb" connectionString="Data Source=(LocalDb)\v11.0;..."; />
In your AccountModels.cs file, you have:
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnectionForLocalDb")
{
}
}
However it should be this way:
<add name="DefaultConnectionForSQLEXPRESS" connectionString="data source=.\SQLEXPRESS;...;" />
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnectionForSQLEXPRESS")
{
}
}
Then you can remove safely DefaultConnectionForLocalDb entry from your web.config and ASPNETDB.MDF from to App_Data.

I don't know if you've figured this out or not but one of the things you can try is: in web.config, connections section, add <Clear/> and then <Remove Name=LocalSqlServer/>
Apparently if you don't change/remove the LocalSqlServe will still try to connect to the aspnetdb.mdf.
You might also think about adding back in the LocalSqlServer and having it point to your SqlExpress or SqlServer.

Related

Log in as domain\user with ActiveDirectoryMembershipProvider

I am using ActiveDirectoryMembershipProvider in ASP.NET WebForms app with this configuration:
<connectionStrings>
<add name="ADConnection" connectionString="LDAP://XXX/OU=XX,DC=XXX,DC=XXX,DC=ac,DC=za"/>
</connectionStrings>
...
<membership defaultProvider="ADProvider">
<providers>
<clear />
<add name="ADProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnection" enableSearchMethods="true" />
</providers>
</membership>
This allows me to log in using user#XXX.XXX.ac.za, but I want to log in using domain\user like one does in Windows. I can't figure out how to do this.
I know I can add attributeMapUsername="sAMAccountName" to the provider definition, which lets me log in simply as 'user' but that's not viable for this client because multiple domains are involved. When I try, I get an error later when I call GetAllUsers() ("Item has already been added. Key in dictionary: 'XXX' Key being added: 'XXX'").
Is there a way to configure ActiveDirectoryMembershipProvider so I can log in with domain\user?

SimpleMembershipProvider not working

I started a new internet project with VS2012 and am trying to just restructure my project a bit and I can't seem to keep the SimpleMemberhsipProvider working. Basically, all I've done is move the models objects into a core project along with a couple other items. I've implemented Ninject and am trying to abstract Entity a bit by using a repository pattern to get my data. I really don't feel as though I've changed much with the current project, but for some reason when I start the application now I get:
{"The Role Manager feature has not been enabled."}
The ActionFilter that is supplied by the framework is where the error is thrown when:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "Id", "UserName", autoCreateTables: true);
is called.
Here is some of the stacktrace:
[ProviderException: The Role Manager feature has not been enabled.]
System.Web.Security.Roles.EnsureEnabled() +9561885
System.Web.Security.Roles.get_Provider() +8
WebMatrix.WebData.WebSecurity.InitializeProviders(DatabaseConnectionInfo
connect, String userTableName, String userIdColumn, String
userNameColumn, Boolean autoCreateTables) +104
WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection(String
connectionStringName, String userTableName, String userIdColumn,
String userNameColumn, Boolean autoCreateTables) +100
InoutBoard.Core.Infrastructure.Filters.SimpleMembershipInitializer..ctor()
in c:\Users\Kyle\Documents\Visual Studio
2012\Projects\InoutBoard\InoutBoard.Core\Infrastructure\Filters\InitializeSimpleMembershipAttribute.cs:42
[InvalidOperationException: The ASP.NET Simple Membership database
could not be initialized. For more information, please see
http://go.microsoft.com/fwlink/?LinkId=256588]
InoutBoard.Core.Infrastructure.Filters.SimpleMembershipInitializer..ctor()
in c:\Users\Kyle\Documents\Visual Studio
2012\Projects\InoutBoard\InoutBoard.Core\Infrastructure\Filters\InitializeSimpleMembershipAttribute.cs:46
I'm hosting the code on github at the following link https://github.com/keroger2k/InoutBoard
First way
Check the sphair's answer out (in current thread).
Second way
Add following assemblies to the web.config:
<system.web>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="WebMatrix.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="WebMatrix.WebData, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
</compilation>
</system.web>
Update
The WebMatrix.WebData assembly contains a start up method to initialize Membership/Role providers and enable RoleManager (PreApplicationStartCode.Start). But ASP.NET couldn't find that to run in your case. By adding these two lines of code, we force ASP.NET to search these assemblies for PreApplicationStartMethodAttribute(s).
In case others are getting this error and the above solution doesn't work, like in my case. It said invalid child object when I tried to add in the assemblies markup. I had to specify the roleManager and membership tags as below. Once I did that the update-database worked.
<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
<providers>
<clear/>
<add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
<membership defaultProvider="SimpleMembershipProvider">
<providers>
<clear/>
<add name="SimpleMembershipProvider"
type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
I had the exact same error running at my hosting company (WinHost.com - they are excellent BTW).
My solution was to add to the web.config:
<appSettings>
<add key="enableSimpleMembership" value="true" />
</appSettings>
Instead of adding the assemblies to the web.config as Mehdi Golchin suggests, an alternative is to change the assembly references on WebMatrix.Data and WebMatrix.WebData to CopyLocal=True.
add the key to the Web.Config as the page:
http://devbla.wordpress.com/2013/07/03/corrigindo-o-erro-no-aspnet-the-role-manager-feature-has-not-been-enabled/
[]'s

Access to database and connection string

This is my connection string:
<add name="modelConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename='D:\Documents and Settings\Dima\My Documents\Visual Studio 2010\WebSites\WebSite10\App_Data\ASPNETDB.MDF';Integrated Security=True;User Instance=True;" providerName="System.Data.SqlClient"/>
It stopped throwing exceptions, but the access to the database doesnt seem to work, cause when i answer the confirmation question, it says it is wrong and wont let me in!!
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear/>
<add
name="MyMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="modelConnectionString"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
enablePasswordReset="true"
maxInvalidPasswordAttempts="1000"
passwordAttemptWindow="4000"
enablePasswordRetrieval="true"
requiresUniqueEmail="false"
passwordFormat="Encrypted"
applicationName="/WebSite10"
/>
</providers>
</membership>
You haven't specified a database name in the connection string - in the top one you are specifying the database file where you should be declaring the database name.
Server=.\SQLExpress;AttachDbFilename=c:\asd\qwe\mydbfile.mdf;Database=dbname; Trusted_Connection=Yes;
If you're attaching a database file to a local instance of SQL then you need to use the AttachDbFilename property.
Can you not create the connection through the Visual studio server explorer. You can log into the server using the correct credentials then save the correct connection string to the config file.
There is a microsoft knowledge base article! on this.

Attached DB Can login but not create user "invalid value for key 'attachdbfilename'"

I have a application running on our server (it works fine on my computer not that it matters).
It is a windows server 2003, Sql Express 2008 r2 server.
Im using a attached DB for storing users (the asp.net supplied db).
I can login to the web application with no problem but when i try to create a user it just says invalid value for key 'attachdbfilename' with the yellow screen of death.
here you have the connection string in the web.config
<add name="ConnectionStringASPNETDB.MDF" connectionString="Data Source=localhost\SQLEXPRESS_2008;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" />
and the membership provider
<add name="daganteckning" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ConnectionStringASPNETDB.MDF"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
description="Stores and retrieves membership data from a Microsoft SQL Server database." />
My only guess is that there is some sort of directory/file security permission i must set but i have no idea what user iis/sql uses to access the database file.
Any one got a idea?
Edit:
I tryed by replacing localhost\sqlexpress_2008 with .\sqlexpress_2008 and now i got
Unable to open the physical file
"C:\Inetpub\wwwroot\MEDLEM_TEST\App_Data\ASPNETDB.MDF".
Operating system error 32: "32(The
process cannot access the file because
it is being used by another
process.)". An attempt to attach an
auto-named database for file
C:\Inetpub\wwwroot\MEDLEM_TEST\App_Data\ASPNETDB.MDF
failed. A database with the same name
exists, or specified file cannot be
opened, or it is located on UNC share.
Check if your server's antivirus or any other process could be accessing the file.
You could also try recycling the application after making the change you listed.
Also if you use the Asp.Net Configuration tool it will attach to the mdf file and your application will create that error while you are connected through that.
After browsing around i found that i was not using the defined provider unless i stated that i wanted to use it by name.. so i solved it by adding <clear /> to the Providers tag and adding the attribute defaultProvider="daganteckning" to the membership tag.
<membership defaultProvider="daganteckning">
<providers>
<clear />
<add name="daganteckning" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ConnectionStringASPNETDB.MDF"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
description="Stores and retrieves membership data from a Microsoft SQL Server database." />
</providers>
....

multiple asp.net membership providers

I have created two custome membership providers that I would like to add to my web.config. The first one would be the default that the asp.net application would use. The second would be called by a WCF service that I have in the same application.
The providers in the membership section of my web.config looks like the following:
<add name="SiteProvider" type="MyNameSpace.SiteProvider, MyNameSpace" ApplicationName="Si2" EnablePasswordReset="true" PasswordStrengthRegularExpression="(?=[\w$#_ ]{8,})(?=.*?\d)(?=.*?[A-z])[\w$#_ ]*" ResetPasswordMinimumLength="8" ResetPasswordPattern="USL9SLU9SLU9SLLLL" ResetPasswordAllowDuplicateCharacters="false" />
<add name="WCFProvider" type="MyNameSpace.WCFProvider, MyNameSpace" ApplicationName="Si2" EnablePasswordReset="true" PasswordStrengthRegularExpression="(?=[\w$#_ ]{8,})(?=.*?\d)(?=.*?[A-z])[\w$#_ ]*" ResetPasswordMinimumLength="8" ResetPasswordPattern="USL9SLU9SLU9SLLLL" ResetPasswordAllowDuplicateCharacters="false" />
I receive the error "Item has already beed added. Key in dictionary: 'SiteProvider' Key being added: 'SiteProvider'" any time I browse to the site.
This doesnt make sense to me sense they have unique names. If i remove the second provider the site is browseable.
Any help on adding this second provider would be appreciated.
The simplest solution would be to move the webservice into a different project.
Also, make sure you call <clear/> before adding providers and include a default one...
<membership defaultProvider="Siteprovider">
<providers>
<clear/>
<add name="SiteProvider" type="MyNameSpace.SiteProvider, MyNameSpace" ApplicationName="Si2" EnablePasswordReset="true" PasswordStrengthRegularExpression="(?=[\w$#_ ]{8,})(?=.*?\d)(?=.*?[A-z])[\w$#_ ]*" ResetPasswordMinimumLength="8" ResetPasswordPattern="USL9SLU9SLU9SLLLL" ResetPasswordAllowDuplicateCharacters="false" />
<add name="WCFProvider" type="MyNameSpace.WCFProvider, MyNameSpace" ApplicationName="Si2" EnablePasswordReset="true" PasswordStrengthRegularExpression="(?=[\w$#_ ]{8,})(?=.*?\d)(?=.*?[A-z])[\w$#_ ]*" ResetPasswordMinimumLength="8" ResetPasswordPattern="USL9SLU9SLU9SLLLL" ResetPasswordAllowDuplicateCharacters="false" />
</providers>
</membership>
You could try the solution in this forum post: http://forums.asp.net/p/1112089/1714276.aspx
Have you tried putting a separate web.config file in the webservice folder? I doubt that it will work, but it might be worth a try.

Resources