如何使用本地身份验证在 asp.net 网络表单中使用新字段更新 ApplicationUser?
How to update ApplicationUser with new fields in asp.net webforms using local authentication?
我在 Register.aspx 模板中添加了 3 个新字段(FirstName、LastName、BuisnessName)。我已经更新了数据库模式,但是当我注册一个新用户时,创建了用户,但新字段没有添加到用户记录中。我已经使用 IdentityUser 扩展了 ApplicationUser class。我做错了什么或遗漏了什么?
如有任何帮助,我们将不胜感激。这是我的代码:
Register.aspx.cs
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, FirstName = FirstName.Text, LastName = LastName.Text, BusinessName = BusinessName.Text };
manager.Create(user, FirstName.Text);
manager.Create(user, LastName.Text);
manager.Create(user, BusinessName.Text);
IdentityResult result = manager.Create(user, Password.Text);
if (result.Succeeded)
{
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
string code = manager.GenerateEmailConfirmationToken(user.Id);
string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");
if (user.EmailConfirmed)
{
signInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
}
else
{
ErrorMessage.Text = "An email has been sent to your account. Please view the email and confirm your account to complete the registration process.";
}
}
else
{
ErrorMessage.Text = result.Errors.FirstOrDefault();
}
}
Register.aspx
<div class="form-horizontal">
<h4>Create a new account</h4>
<hr />
<asp:ValidationSummary runat="server" CssClass="text-danger" />
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="FirstName" CssClass="col-md-2 control-label">First Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="FirstName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="FirstName"
CssClass="text-danger" ErrorMessage="The First Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="LastName" CssClass="col-md-2 control-label">Last Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="LastName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="LastName"
CssClass="text-danger" ErrorMessage="The Last Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="BusinessName" CssClass="col-md-2 control-label">Business Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="BusinessName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="BusinessName"
CssClass="text-danger" ErrorMessage="The Business Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
CssClass="text-danger" ErrorMessage="The email field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="Password" CssClass="col-md-2 control-label">Password</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="Password" TextMode="Password" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="Password"
CssClass="text-danger" ErrorMessage="The password field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="ConfirmPassword" CssClass="col-md-2 control-label">Confirm password</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="ConfirmPassword"
CssClass="text-danger" Display="Dynamic" ErrorMessage="The confirm password field is required." />
<asp:CompareValidator runat="server" ControlToCompare="Password" ControlToValidate="ConfirmPassword"
CssClass="text-danger" Display="Dynamic" ErrorMessage="The password and confirmation password do not match." />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" CssClass="btn btn-default" />
</div>
</div>
</div>
IdentityModels.cs
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string BusinessName { get; set; }
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("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
}
我从你的代码中发现了一些东西:
方法 manager.Create()
需要一个 ApplicationUser
类型的对象,可选的第二个参数是 string password
.
您应该删除这三行:
IdentityResult result2 = manager.Create(user, FirstName.Text);
IdentityResult result3 = manager.Create(user, LastName.Text);
IdentityResult result4 = manager.Create(user, BusinessName.Text);
最后,我不确定你的ApplicationUser
中的属性是否应该标记为virtual
。请参阅此 SO post 以获得更好的解释。
我的建议是从以下属性中删除 virtual
:
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string BusinessName { get; set; }
我在 Register.aspx 模板中添加了 3 个新字段(FirstName、LastName、BuisnessName)。我已经更新了数据库模式,但是当我注册一个新用户时,创建了用户,但新字段没有添加到用户记录中。我已经使用 IdentityUser 扩展了 ApplicationUser class。我做错了什么或遗漏了什么?
如有任何帮助,我们将不胜感激。这是我的代码:
Register.aspx.cs
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, FirstName = FirstName.Text, LastName = LastName.Text, BusinessName = BusinessName.Text };
manager.Create(user, FirstName.Text);
manager.Create(user, LastName.Text);
manager.Create(user, BusinessName.Text);
IdentityResult result = manager.Create(user, Password.Text);
if (result.Succeeded)
{
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
string code = manager.GenerateEmailConfirmationToken(user.Id);
string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>.");
if (user.EmailConfirmed)
{
signInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
}
else
{
ErrorMessage.Text = "An email has been sent to your account. Please view the email and confirm your account to complete the registration process.";
}
}
else
{
ErrorMessage.Text = result.Errors.FirstOrDefault();
}
}
Register.aspx
<div class="form-horizontal">
<h4>Create a new account</h4>
<hr />
<asp:ValidationSummary runat="server" CssClass="text-danger" />
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="FirstName" CssClass="col-md-2 control-label">First Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="FirstName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="FirstName"
CssClass="text-danger" ErrorMessage="The First Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="LastName" CssClass="col-md-2 control-label">Last Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="LastName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="LastName"
CssClass="text-danger" ErrorMessage="The Last Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="BusinessName" CssClass="col-md-2 control-label">Business Name</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="BusinessName" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="BusinessName"
CssClass="text-danger" ErrorMessage="The Business Name field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
CssClass="text-danger" ErrorMessage="The email field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="Password" CssClass="col-md-2 control-label">Password</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="Password" TextMode="Password" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="Password"
CssClass="text-danger" ErrorMessage="The password field is required." />
</div>
</div>
<div class="form-group">
<asp:Label runat="server" AssociatedControlID="ConfirmPassword" CssClass="col-md-2 control-label">Confirm password</asp:Label>
<div class="col-md-10">
<asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" CssClass="form-control" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="ConfirmPassword"
CssClass="text-danger" Display="Dynamic" ErrorMessage="The confirm password field is required." />
<asp:CompareValidator runat="server" ControlToCompare="Password" ControlToValidate="ConfirmPassword"
CssClass="text-danger" Display="Dynamic" ErrorMessage="The password and confirmation password do not match." />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" CssClass="btn btn-default" />
</div>
</div>
</div>
IdentityModels.cs
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string BusinessName { get; set; }
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("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
}
我从你的代码中发现了一些东西:
方法 manager.Create()
需要一个 ApplicationUser
类型的对象,可选的第二个参数是 string password
.
您应该删除这三行:
IdentityResult result2 = manager.Create(user, FirstName.Text);
IdentityResult result3 = manager.Create(user, LastName.Text);
IdentityResult result4 = manager.Create(user, BusinessName.Text);
最后,我不确定你的ApplicationUser
中的属性是否应该标记为virtual
。请参阅此 SO post 以获得更好的解释。
我的建议是从以下属性中删除 virtual
:
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string BusinessName { get; set; }