如何从 AspNetUsers 表中获取自定义 ID
本文关键字:获取 自定义 ID AspNetUsers | 更新日期: 2023-09-27 18:30:36
我目前正在开发一个用 ASP.NET 和C#开发的网站。要从AspNetUsers
表中获取UserId
,只需执行User.Identity.GetUserId()
即可返回类似 m13t79j0-4p5e-829h-4x10-fyv74k0w2ff6
的内容。现在我需要将其更改为自定义UserId
这将是一个int
,所以像
1
2
3
and so on
在IdentityModel
中,我有以下代码指向表自定义表和 ID
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().ToTable("CustomTable").Property(p => p.Id).HasColumnName("MyCustomId");
}
但是当我User.Identity.GetUserId()
时,它仍然返回此 id User.Identity.GetUserId()
.我对 C# 和 ASP.NET 相当陌生,所以有人可以告诉我哪里出错了?我是否必须覆盖GetUserId()
方法?提前感谢您的所有帮助和支持
据我了解,您必须将 Asp.Net Identity中的AspNetUsers表与当前的"用户"表相关联。实现它的一种可能性是在 AspNetUsers 表中创建一个新列(外键),其中包含用户表中的当前 UserId,如下所示:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var applicationUser = modelBuilder.Entity<ApplicationUser>().HasKey(u => u.Id).ToTable("Users", "dbo");
applicationUser.Property(iu => iu.UserId).HasColumnName("UserId");
...
或者只是添加一个具有关系的新表,就像您在问题中所做的那样。
网页接口
然后,您可以从AuthorizeAttribute
覆盖OnAuthorizationAsync
方法,并使用Principal.Identity.GetUserId()
从 Db 获取您的 UserId:
public class WebApiAuthorizeAttribute : AuthorizeAttribute
{
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
base.OnAuthorization(actionContext);
Guid userId;
if (actionContext.RequestContext.Principal.Identity.IsAuthenticated
&& Guid.TryParse(actionContext.RequestContext.Principal.Identity.GetUserId(), out userId))
{
ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() };
ApplicationUser user = await manager.FindByIdAsync(userId);
actionContext.Request.Properties.Add("MyCustomId", user.MyCustomId);
}
}
}
要检索控制器操作上的值,请执行以下操作:
object MyCustomId;
Request.Properties.TryGetValue("MyCustomId", out MyCustomId);
ASP.NET MVC
对于 ASP.Net MVC 覆盖 OnAuthorization 而不是 OnAuthorizationAsync:
public class MvcAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
var userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
ApplicationUserManager manager =
new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext()))
{
PasswordHasher = new CustomPasswordHasher()
};
var user = manager.FindById(userId);
actionContext.Request.Properties.Add("MyCustomId", user.MyCustomId);
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
试试这个:
var curretlyLoggedInUserId = (((System.Security.Claims.ClaimsPrincipal)System.Web.HttpContext.Current.User).Claims).ToList()[0].Value;
这让我从ASP中的AspNetUsers表中获得了Id。