我目前正在开发一个用ASP.NET和C#开发的网站。只需执行返回UserId
之类的AspNetUsers
即可从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()
方法?提前感谢您的所有帮助和支持
答案 0 :(得分:1)
据我了解,您必须将Asp.Net Identity的AspNetUsers表与您当前的Users表相关联。实现它的一种可能性是在AspNetUsers表中创建一个新列(外键),其中包含来自Users表的当前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");
...
或者只是像你在问题中那样添加一个包含关系的新表。
Web Api
然后,您可以覆盖OnAuthorizationAsync
的{{1}}方法,并使用AuthorizeAttribute
从Db获取您的UserId:
Principal.Identity.GetUserId()
要检测控制器操作的值,请执行以下操作:
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);
}
}
}
ASP.NET MVC
对于ASP.Net MVC覆盖OnAuthorization而不是OnAuthorizationAsync:
object MyCustomId;
Request.Properties.TryGetValue("MyCustomId", out MyCustomId);
答案 1 :(得分:0)
没有快速解决方法。您要做的是创建自己的自定义UserManager og UserStore。看看这个问题并回答:ASP.NET Identity with EF Database First MVC5
本文将概述ASP.NET身份验证系统的工作原理: http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity
答案 2 :(得分:0)
尝试:
var curretlyLoggedInUserId = (((System.Security.Claims.ClaimsPrincipal)System.Web.HttpContext.Current.User).Claims).ToList()[0].Value;
这会从ASP的AspNetUsers表中获取ID。