我已经建立了一个新的 asp.net Web表单应用程序。我想使用我自己的实体框架数据模型,使用提供的 owin 身份验证创建登录和注册功能。
我已经将我的连接字符串从默认值更改为 IdentityModel 中的连接字符串.cs但在使用登录名时,我收到上述错误。
代码与默认值相同,当我将应用程序DBContext更改回默认连接时,它按预期工作。
我能够访问数据库中的数据,因为我使用 linq 查询来检查输入的电子邮件和密码。
该错误在登录用户控件中的以下行引发:
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
我需要做些什么才能使 owin 身份验证与提供的 DefaultConnection 以外的数据库一起工作?
代码片段:
生成的寄存器:
protected void CreateUser_Click(object sender, EventArgs e)
{
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
IdentityResult result = manager.Create(user, Password.Text);
if (result.Succeeded)
{
signInManager.SignIn( user, isPersistent: false, rememberBrowser: false);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
}
else
{
ErrorMessage.Text = result.Errors.FirstOrDefault();
}
}
生成的登录名:
protected void LogIn(object sender, EventArgs e)
{
if (IsValid)
{
// Validate the user password
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
break;
case SignInStatus.LockedOut:
Response.Redirect("/Account/Lockout");
break;
case SignInStatus.RequiresVerification:
Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}",
Request.QueryString["ReturnUrl"],
RememberMe.Checked),
true);
break;
case SignInStatus.Failure:
default:
FailureText.Text = "Invalid login attempt";
ErrorMessage.Visible = true;
break;
}
用于查找用户的 Linq 查询:
var myUser = db.Dat_Account
.FirstOrDefault(u => u.UserName == Email.Text
&& u.Password == Password.Text);
生成的应用程序用户
public class ApplicationUser : IdentityUser
{
public ClaimsIdentity GenerateUserIdentity(ApplicationUserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
{
return Task.FromResult(GenerateUserIdentity(manager));
}
}
我的用户表包含的字段不仅仅是用户名、电子邮件和密码。这是否可能导致问题?
上下文:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("MyDBEntities", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
看起来您没有数据库初始值设定项,因此默认行为为 CreateDatabaseIfNotExists。因此,要么删除现有数据库,让 EF 使用标识内容创建它,要么将初始值设定项切换到构造函数中的 DropCreateDatabaseWhenModelChanges:
static ApplicationDbContext() {
Database.SetInitializer(new DropCreateDatabaseWhenModelChanges<ApplicationDbContext>());
}
一旦您启动并运行并拥有您不想丢失的数据,您应该关闭初始值设定项(Database.SetInitializer(new NullDatabaseInitializer());)或使用迁移。
http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm