我们创建了一个新的ASP.NET 4.5.1项目,如下所示:
在解决方案资源管理器中> App_Start> Startup.Auth.cs文件有以下代码,用于配置ASP.NET Indentity。我们如何更改UserManager存储用户数据的数据库?
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
};
}
答案 0 :(得分:8)
除了@ ta.speot.is和@Shaun提到的内容之外:您还可以将上下文中的连接字符串名称(存储在web.config中)传递给IdentityDbContext的base constructor
public class MyDbContext : IdentityDbContext<MyUser>
{
public MyDbContext()
: base("TheNameOfTheConnectionString")
{
}
}
此tutorial包含一个广泛的示例。
另一种方法是使用连接字符串的名称作为上下文构造函数的参数,并将其传递给基础构造函数。
答案 1 :(得分:7)
将您自己的DbContext
传递给UserStore
构造函数,或更改名为DefaultConnection
的Web.config连接字符串。无论哪种方式,@ ta.speot.is的评论都是正确的。
<强>正确强>
// do this - it's the factory pattern
UserManagerFactory
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));
<强>不正确强>
// do NOT do this - use the preceding code.
var userStore = new UserStore<IdentityUser>(new MyDbContext());
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;
<强>详情
UserStore
类公开了非常基本的用户管理API。在代码中,我们将其配置为将用户数据存储为IdentityUser
数据存储中的MyDbContext
类型。
UserManager
类公开了一个更高级别的用户管理API,可自动保存对UserStore
的更改。在代码中,我们将其配置为使用我们刚刚创建的UserStore
。
UserManagerFactory
应该实现工厂模式,以便为每个应用程序请求获取一个UserManager
实例。否则您将获得以下异常:
模型时不能使用上下文 被创造。如果使用上下文,则可能抛出此异常 在OnModelCreating方法内部或者相同的上下文实例 由多个线程同时访问。请注意实例成员 DbContext和相关类不保证是线程 安全
就是这样。