我使用asp.net Identity 2.0让用户登录我的网站,其中身份验证详细信息存储在SQL数据库中。 Asp.net Identity已经以标准方式实现,可以在许多在线教程中找到。
ApplicationUser
中的IdentityModels
类已扩展为包含自定义属性:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
{
CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
//My extended property
public string Code { get; set; }
}
当我注册新用户时,我在Code
中传递了RegisterBindingModel
自定义属性,但我不确定如何将此自定义属性插入到WebUsers表中。
我做了如下,但实际上并没有将此属性与用户名和密码一起插入到表中。
var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };
整个功能:
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var userName = !string.IsNullOrEmpty(model.UserName) ? model.UserName : model.Email;
//I set it here but it doesn't get inserted to the table.
var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
return Ok();
}
我错过了什么? 我正在寻找类似的问题,但无法找到答案。
答案 0 :(得分:48)
如果您按照向用户添加自定义字段的所有步骤操作,您将成功完成任务。
以下是向用户添加自定义字段的所有步骤:
转到模型文件夹→打开 IdentityModels.cs → ApplicationUser 类并添加属性:
public string Code { get; set; }
键入Enable-Migrations
并按 Enter 并等待任务完成。你会看到一个回复说:
Checking if the context targets an existing database... Code First Migrations enabled for project WebApplication1.
键入Add-Migration "Code"
并按 Enter 并等待任务完成。你会看到一个回复说:
Scaffolding migration 'Code'. The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration Code' again.
键入Update-Database
并按 Enter 并等待任务完成。你会看到一个回复说:
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Applying explicit migrations: [201611132135242_Code]. Applying explicit migration: 201611132135242_Code. Running Seed method.
在此步骤中,如果您刷新 SQL Server对象资源管理器并转到数据库并查看表格,则在列下的dbo.AspNetUsers
下,您会看到Code
字段。如果您不知道应该查找哪个数据库甚至是哪个服务器,请打开 Web.Config 文件并查看连接字符串,如下所示:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20161114125903.mdf;Initial Catalog=aspnet-WebApplication1-20161114125903;Integrated Security=True"
providerName="System.Data.SqlClient" />
您可以看到数据源(sql server instance)和.mdf这是数据库名称。
转到模型文件夹→打开 AccountViewModels.cs 文件→ RegisterViewModel 类并添加以下属性: (在带有EF6的APIv2中,您可以在Models文件夹→AccountBindingModels文件→RegisterBindingModel类中添加以下行)
public string Code { get; set; }
转到视图文件夹→帐户文件夹→打开 Register.cshtml 文件,并将此代码添加到其他字段附近,例如密码以下:
<div class="form-group">
@Html.LabelFor(m => m.Code, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Code, new { @class = "form-control" })
</div>
</div>
转到控制器文件夹→打开 AccountController.cs 文件→在http post 注册操作中,更改创建用户的行对此:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email,
Code= model.Code };
运行项目并转到/Account/Register
网址并注册新用户。注册用户后,如果再次访问数据库并 dbo.AspNetUsers 表的查看数据,您将看到代码已保存。
下载强>
您可以在此处克隆或下载工作示例:
进一步阅读 - 如何将自定义属性添加到IdentityRole?
如果您有兴趣知道如何向IdentityRole
添加新属性,请查看How to Add a custom Property to IdentityRole?
答案 1 :(得分:6)
如果已经使用' Authentication 个人用户帐户创建了项目:
在解决方案资源管理器中,转到项目>模型> IdentityModels.cs
在public class ApplicationUser: IdentityUser
下的(应该是头等舱)。
在之后添加您的自定义属性
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
就像下面的示例:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
**//add custom properties here - these are just examples**
public bool SendEmails { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后使用NuGet Packagemanager:
我希望这会有所帮助。
答案 2 :(得分:0)
我认为主要问题仍然是您没有在QueryBuilder jqlQuery = QueryBuilder.byClass(Person.class).withCommitProperty("personName","john");
List<CdoSnapshot> snapshots = javers.findSnapshots(jqlQuery.build());
类中注册新声明。
我遇到了同样的问题,在ApplicationUser
之后几行就解决了。
CreateIdentityAsync