如何从 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()方法?提前感谢您的所有帮助和支持

如何从 AspNetUsers 表中获取自定义 ID

据我了解,您必须将 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。