Asp.net core 标识核心获取名称&;其他领域

Asp.net core 标识核心获取名称&;其他领域,asp.net-core,.net-core,asp.net-core-mvc,asp.net-identity,identity,Asp.net Core,.net Core,Asp.net Core Mvc,Asp.net Identity,Identity,我注意到,使用Identity core,我可以通过以下方式获取名称字段: HttpContext.User.Identity.Name 我不明白这个值是如何设置的,以及如何向其中添加其他字段,如MyCustomField、Address或Id。我一直在查看开放源代码,但我似乎无法理解它。理想情况下,我希望在身份项目之外和我自己的范围内完成这项工作 有人能给我解释一下这是如何工作的,以及我将如何添加更多字段吗 编辑: 如果我想添加地址,我将编写以下代码: public static class

我注意到,使用Identity core,我可以通过以下方式获取名称字段:

HttpContext.User.Identity.Name
我不明白这个值是如何设置的,以及如何向其中添加其他字段,如MyCustomField、Address或Id。我一直在查看开放源代码,但我似乎无法理解它。理想情况下,我希望在身份项目之外和我自己的范围内完成这项工作

有人能给我解释一下这是如何工作的,以及我将如何添加更多字段吗

编辑:

如果我想添加地址,我将编写以下代码:

public static class IdentityExtensions
{
     public static string GetAddress(this IIdentity identity)
     {
         return ((ClaimsIdentity) identity).FindFirst("Address").Value;
     }
 }
现在,上面的代码允许我从声明中提取地址值,但我不明白的是如何将值保存在声明中


如果我使用EF,那么我会在
GenerateUserIdentityAsync
方法下这样做。然而,我不是,我正在使用dapper,所以我试图了解它是如何工作的。我应该在什么时候从数据库中读取信息并将其添加到声明中(我知道这会发生在登录时,但在代码中的什么地方发生,当前名称是如何填写的)?

我通过执行以下操作来完成这一点:

1-向数据库中名为[staff_id]的[AspNetUsers]表中添加了一个新列

2-创建了从IdentityUser继承的ApplicationUser类

public class ApplicationUser : IdentityUser
{
 public ApplicationUser(){ }
 public int staff_id { get; set; }
}
3-创建了一个类AppClaimsPrincipalFactory,该类继承UserClaimsPrincipalFactory并重写CreateSync方法

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;
    }
}
下面是一些我认为有用的其他资源。祝你好运


我通过以下操作完成了这一点:

1-向数据库中名为[staff_id]的[AspNetUsers]表中添加了一个新列

2-创建了从IdentityUser继承的ApplicationUser类

public class ApplicationUser : IdentityUser
{
 public ApplicationUser(){ }
 public int staff_id { get; set; }
}
3-创建了一个类AppClaimsPrincipalFactory,该类继承UserClaimsPrincipalFactory并重写CreateSync方法

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;
    }
}
下面是一些我认为有用的其他资源。祝你好运


它存储在索赔单中。请参阅和,以查看索赔定义。Name属性从用户名中的声明集获取它,在本例中为
ClaimTypes.Name
,您可以通过
user.Identity.Claims
访问它,它存储在声明中。请参阅和,以查看索赔定义。Name属性从用户名中的声明集获取它,在本例中为
ClaimTypes.Name
,您可以通过
user.Identity.Claims
访问它,谢谢您的详细介绍。我有点困惑的是,您在
CreateAsync
方法上创建了一个声明。这意味着这些声明是在首次创建用户时创建的。那么,您的索赔将被记录并写入数据库索赔表?当值更改时会发生什么情况,如何更新?我有一个编辑表单来添加/编辑新用户[AspNetUsers]。我的表单中有一个下拉列表,用于表格中的staff_id列。现在,当我创建的用户尝试登录时,Identity framework验证用户名和密码是否与表中的记录对应。如果用户成功登录,则在经过身份验证的用户上加载/存储自定义索赔人员id。这有用吗?回答您的问题:声明是在用户每次登录应用程序时创建的,没有声明存储在另一个表中。您可以通过更新数据库中的记录来更改索赔的值。谢谢您的详细介绍。我有点困惑的是,您在
CreateAsync
方法上创建了一个声明。这意味着这些声明是在首次创建用户时创建的。那么,您的索赔将被记录并写入数据库索赔表?当值更改时会发生什么情况,如何更新?我有一个编辑表单来添加/编辑新用户[AspNetUsers]。我的表单中有一个下拉列表,用于表格中的staff_id列。现在,当我创建的用户尝试登录时,Identity framework验证用户名和密码是否与表中的记录对应。如果用户成功登录,则在经过身份验证的用户上加载/存储自定义索赔人员id。这有用吗?回答您的问题:声明是在用户每次登录应用程序时创建的,没有声明存储在另一个表中。您可以通过更新数据库中的记录来更改索赔的值。