我注意到使用Identity核心,我可以通过以下方式获取名称字段:
HttpContext.User.Identity.Name
我不明白如何设置此值以及如何向其中添加其他字段,例如MyCustomField或Address或Id。我一直在寻找开源https://github.com/aspnet/Identity但是,我似乎无法弄明白。理想情况下,我想在身份项目之外和我自己的内部。
有人可以向我解释一下这是如何工作的,以及我将如何添加更多字段?
编辑:
如果我想添加地址,我会写下面的代码:
public static class IdentityExtensions
{
public static string GetAddress(this IIdentity identity)
{
return ((ClaimsIdentity) identity).FindFirst("Address").Value;
}
}
现在上面的代码允许我从声明中提取地址值,但我不明白的是如何将值保存在那里。
如果我使用EF,那么我会在GenerateUserIdentityAsync
方法下执行此操作。但是,我不是,我正在使用短小精悍,所以我试图了解这是如何工作的。在什么时候我会从数据库中读取信息并将其添加到声明中(我知道这会在登录时发生,但代码中会发生这种情况,如何填写当前名称)?
答案 0 :(得分:2)
我通过以下方式完成了这项工作:
1 - 在数据库中名为[staff_id]的[AspNetUsers]表中添加了一个新列。
2 - 创建了一个继承自IdentityUser
的ApplicationUser类public class ApplicationUser : IdentityUser
{
public ApplicationUser(){ }
public int staff_id { get; set; }
}
3 - 创建了一个AppClaimsPrincipalFactory类,它继承了UserClaimsPrincipalFactory并覆盖了CreateAsync方法。
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager,
IOptions<IdentityOptions> optionsAccessor
): base(userManager, roleManager, optionsAccessor){ }
public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await base.CreateAsync(user);
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim("staff_id",user.staff_id.ToString())
});
return principal;
}
}
4 - 修改了Startup.cs ConfigureServices方法,添加代码以使用我的本地AppClaimsPrincipalFactory类在登录时自定义用户
//add Entity Framework
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString")));
//add Identity framework, specify which DbContext to use
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<MyDbContext>()
.AddDefaultTokenProviders();
//add local AppClaimsPrincipalFactory class to customize user
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
5 - 最后我按如下方式访问声明,可能有更好的方法,但这是我访问经过身份验证的用户的staff_id的方式。
int iStaffId;
if(!Int32.TryParse(User.FindFirst("staff_id").Value, out iStaffId))
{
//throw an error because the staff_id claim should be present in iStaffId
}
我发现有用的其他一些资源如下。祝好运。
How to extend ASP.NET Core Identity user