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
列,还有一个varcharId
列,该列显示为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
}