Asp.Net 核心标识获取整数用户 ID



我有一个 ASP.NET MVC Core n层应用程序。我将默认主键更改为整数。没有问题。但是我尝试 GetUserId() 用户管理器的默认方法返回字符串。我写了自己的方法还是做错了什么?

//In controller
public int GetLoggedUserId()
{
//it's return still string and of course i can't compile my code 
//problem is here
return UserService.GetUserId(); 
}
public class ApplicationUser : IdentityUser<int>
{
[MaxLength(255)]
public string LogoPath { get; set; }
}
public partial class MyUserManager : UserManager<ApplicationUser>
{
private readonly IUnitOfWork _unitOfWork;
public MyUserManager(IUnitOfWork unitOfWork,
IUserStore<ApplicationUser> store,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<ApplicationUser> passwordHasher,
IEnumerable<IUserValidator<ApplicationUser>> userValidators,
IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators,
ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<UserManager<ApplicationUser>> logger) :
base(store, optionsAccessor, passwordHasher,
userValidators,
passwordValidators,
keyNormalizer,
errors,
services,
logger)
{
_unitOfWork = unitOfWork;
}
}
services.AddDefaultIdentity<ApplicationUser>()
.AddEntityFrameworkStores<MyDbContext>()
.AddUserManager<MyUserManager>()
.AddDefaultTokenProviders();

用户 ID 存储为用户主体上的声明。您可以通过以下方式访问它(在控制器/页面/视图中):

string userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

声明存储为字符串,因此如果需要 int:

var userIdClaim = User.FindFirstValue(ClaimTypes.NameIdentifier);
var userId = int.TryParse(userIdClaim, out var id) ? id : 0;

用户主体存在于HttpContext上,因此在存在User便利属性的位置之外,您需要注入IHttpContextAccessor然后:

var userIdClaim = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);

默认方法.GetUserId()确实返回一个字符串。此问题可以通过编写自定义方法来解决,该方法从数据库中访问 int 值并将其返回到GetLoggedUserId()方法。

相关内容

  • 没有找到相关文章