Authentication ASP.NET核心身份验证Id?

Authentication ASP.NET核心身份验证Id?,authentication,asp.net-core,Authentication,Asp.net Core,启用身份验证的方法可以正常工作,但是应该使用什么标识符在数据库中存储用户的数据呢?唯一容易获得的是User.Name,它似乎是我的电子邮件地址 我看到在数据库中有一个AspNetUsers表,该表作为UserName列,还有一个varcharId列,该列显示为GUID,是主键。“Id”字段似乎是要使用的逻辑值,但它在我的应用程序中不可用。我发现我可以这样做: string ID_TYPE = "http://schemas.xmlsoap.org/ws/2005/05/identity/clai

启用身份验证的方法可以正常工作,但是应该使用什么标识符在数据库中存储用户的数据呢?唯一容易获得的是
User.Name
,它似乎是我的电子邮件地址

我看到在数据库中有一个
AspNetUsers
表,该表作为
UserName
列,还有一个varchar
Id
列,该列显示为GUID,是主键。“Id”字段似乎是要使用的逻辑值,但它在我的应用程序中不可用。我发现我可以这样做:

string ID_TYPE = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier";
var id = User.Claims.Where(x => x.Type == ID_TYPE).Select(x => x.Value).FirstOrDefault();
var user = await _userManager.GetUserAsync(HttpContext.User);
var id =  user.Id;
var myExtendedInfo = user.MyExtendedInfo;
var myOtherInfo = user.MyOtherInfo;
但这似乎是一种奇怪的方式。如果我想创建一个“Posts”表,其中有一个与post相关联的用户,那么使用这个值是否合适

我已经看过了,很多这可能是由于微软将相同的登录过程与ActiveDirectory集成在一起


有没有理由让身份证这么难拿到,名字这么容易取?我应该改用这个名字吗?我应该注意不要让用户更改他们的用户名吗?

到UserId的最短路径是:

User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
如果您需要经常访问UserId,也可以像这样创建扩展:

public static class ClaimsPrincipalExtensions
{
    public static string GetUserId(this ClaimsPrincipal principal)
    {
        if (principal == null)
            return null; //throw new ArgumentNullException(nameof(principal));

        string ret = "";

        try
        {
            ret = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        }
        catch (System.Exception)
        {                
        }
        return ret;
    }
}
用法:

User.GetUserId()

在控制器中,使用依赖项注入获取用户管理器: 创建一个具有扩展属性的类MyUser

  public class MyUser : IdentityUser
  {
    public string MyExendedInfo { get; set; }
    public int MyOtherInfo {get;set;}
  }
使用迁移将此属性添加到数据库,或手动添加

在配置服务的Startup.cs中添加:

 services.AddIdentity<MyUser, IdentityRole>()

您还可以更新有关用户的信息:

user.myExtendedInfo = "some string";
user.MyOtherInfo = myDatabase.pointer;
var result = await _userManager.UpdateAsync(user);
if (!result.Succeeded)
{
  //handle error
}
因此,只要您只希望在数据库中存储有限的额外数据,就可以创建一个自定义用户类,并使用标识系统为您存储它。我不会自己储存。 但是,如果需要在单独的表中存储大量信息和/或引用其他表中的用户,则Id是要使用的正确字段,您可以如上所示访问它


我不知道在AspNetUsers中可以存储多少信息的最佳实践是什么,而不是在声明中,或者在您自己的表中,但是由于提供的表已经存储了诸如用户名、电话号码等内容,所以我认为可以这样扩展它

您可以使用已知唯一的任何字段(例如NormalizedUserName或NormalizedEmail)来代替Id,方法与上面所示的相同。var email=user.NormalizedEmail;
user.myExtendedInfo = "some string";
user.MyOtherInfo = myDatabase.pointer;
var result = await _userManager.UpdateAsync(user);
if (!result.Succeeded)
{
  //handle error
}