We have created a new ASP.NET 4.5.1 project as follows:
In the solution explorer > App_Start > Startup.Auth.cs file there is the following code which configures ASP.NET Indentity. How do we change the database in which the UserManager stores user data?
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
}
ASP.NET Identity is Microsoft's user management library for ASP.NET. It includes functionality such as password hashing, password validation, user storage, and claims management. It usually also comes with some basic authentication, bringing its own cookies and multi-factor authentication to the party.
Identity data is the collection of data about an individual person, such as their name, address, bank account number, health records, and other highly sensitive information.
ASP.NET Identity is the membership system for authentication and authorization of the users by building an ASP.NET application. ASP.NET Identity is the membership system for authentication and authorization of the users by building an ASP.NET application.
Additionally to what @ta.speot.is and @Shaun mentioned: You can also pass the name of the connection string (stored in the web.config) in your context to the base constructor of the IdentityDbContext
public class MyDbContext : IdentityDbContext<MyUser>
{
public MyDbContext()
: base("TheNameOfTheConnectionString")
{
}
}
This tutorial contains an extensive example.
Another way would be to use the name of the connection string as a parameter of your context constructor and pass it to the base constructor.
Pass your own DbContext
to the UserStore
constructor or change the Web.config connection string named DefaultConnection
. Either way the comments by @ta.speot.is are correct.
Correct
// do this - it's the factory pattern
UserManagerFactory
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));
Incorrect
// do NOT do this - use the preceding code.
var userStore = new UserStore<IdentityUser>(new MyDbContext());
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;
Details
The UserStore
class exposes a very basic user management api. In code, we configure it to store user data as type IdentityUser
in the MyDbContext
data store.
The UserManager
class exposes a higher level user management api that automatically saves changes to the UserStore
. In code, we configure it to use the UserStore
that we just created.
The UserManagerFactory
should implement the factory pattern in order to get one instance of UserManager
per request for the application. Otherwise you will get the following exception:
The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.
That's all.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With