你如何获得ASP.Net MVC中的用户对象的UserID?

我有一些表有一个uniqueidentifier UserID涉及到aspnet_Users.UserID。 当用户提交这些表的一些数据,因为控制器方法有一个[授权]我得到一个用户对象。 我可以用User.Identity.Name获取用户名,但是如何获得UserID能够build立(所有权)关系?

看来你不能从用户对象获取它,但你可以这样得到它:

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey; 

这是解决scheme:

包括:

 using Microsoft.AspNet.Identity; 

然后使用扩展方法:

 User.Identity.GetUserId(); 

首先,这个答案不是严格的MVC答案,而是一个ASP.NET答案。 在这种情况下,您的网站是MVC的事实与解决问题无关。


嗯。 我不是很确定你是如何处理你的系统中的用户的,但是听起来像你使用(.net)非常邪恶的asp.net membership provider 。 这是由你说的事实暗示的

  • aspnet_Users.UserID
  • UserID是一个唯一的标识符(阅读:GUID)。

使用默认的表单身份validation系统(使用默认的FormsIdentity) ,它只有一个名为Name的属性(正如您正确指出的那样)。 这意味着它只有一个值放置一些独特的用户信息。 在你的情况下,你正在名称/用户名/显示Name ,在Name属性。 我假设这个名字是他们的显示名称,并且是唯一的。 无论你把什么价值放在这里,它都是独一无二的

从这里,你可以抓住用户的指导。

看一下这个。

 using System.Web.Security; .... // NOTE: This is a static method .. which makes things easier to use. MembershipUser user = Membership.GetUser(User.Identity.Name); if (user == null) { throw new InvalidOperationException("User [" + User.Identity.Name + " ] not found."); } // Do whatever u want with the unique identifier. Guid guid = (Guid)user.ProviderUserKey; 

所以,每次你想抓取用户信息,都需要用上面的静态方法从数据库中抓取。

阅读有关MSDN上的Membership类和MembershipUser类的所有信息。

奖金答案/build议

因此,我会CACHE的结果,所以你不需要保持击中数据库。

 ... cont from above.... Guid guid = (Guid)user.ProviderUserKey; Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid. 

否则,您可以创build自己的Identity类(从IIdentityinheritance),并添加您自己的自定义属性,如UserID 。 然后,无论您何时进行身份validation(以及每次请求),都可以设置此值。 无论如何,这是一个很难的核心解决scheme,所以现在就去caching吧。

HTH

User.Identity是一个IPrincipal – 通常是System.Web.Security.FormsIdentitytypes

它不知道用户标识的任何内容 – 这只是“身份”概念的抽象。

IIdentity接口只对用户有“名称”,甚至不包括“用户名”。

如果你使用默认的SimpleMembershipProvider MVC4,你可以这样做:

 WebSecurity.GetUserId(User.Identity.Name) // User is on ControllerBase 

(其中WebSecurity位于WebMatrix中的nuget包Microsoft.AspNet.WebPages.WebData

你也可以使用

 WebSecurity.CurrentUserName WebSecurity.CurrentUserId 

(如果您使用的ASPNETMembershipProvider是较为复杂的ASPNET成员系统,请参阅@ eduncan911的答案)

如果您正在使用ASP.NET成员资格(进而使用IPrincipal对象):

 using System.Web.Security; { MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name); Guid guid = (Guid)user.ProviderUserKey; } 

User.Identity总是返回当前用户的状态,login或不。

匿名或不等等,所以检查login:

 if (User.Identity.IsAuthenticated) { ... } 

所以,把它们放在一起:

 using System.Web.Security; { if (User.Identity.IsAuthenticated) { MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name); Guid guid = (Guid)user.ProviderUserKey; } } 

最好的select获取用户名

添加以下参考

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security;* public myFunc() { ..... // Code which will give you user ID is var tmp = User.Identity.GetUserId(); } 

如果您使用自己的IPrincipal对象进行授权,则只需将其强制转换为访问Id即可。

例如:

 public class MyCustomUser : IPrincipal { public int UserId {get;set;} //...Other IPrincipal stuff } 

这是一个关于创build自己的基于表单的authentication的很好的教程。

http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx

这应该让你在正确的道路上为你的用户创build一个身份validationcookie并访问你的自定义用户数据。

 using System.Web.Security; MembershipUser user = Membership.GetUser(User.Identity.Name); int id = Convert.ToInt32(user.ProviderUserKey); 

它的ProviderUserKey属性。

 System.Web.Security.MembershipUser u; u.ProviderUserKey 

简单….

 int userID = WebSecurity.CurrentUserId; 

通常你可以使用WebSecurity.currentUserId ,但是如果你刚刚在AccountController中创build帐户,并且想要使用用户ID将用户链接到其他表中的某些数据,那么WebSecurity.currentUserId (以及所有的上面的解决scheme),不幸的是,在这种情况下返回-1,所以它不起作用。

幸运的是,在这种情况下,您可以方便地获取UserProfiles表的数据库上下文,以便您可以通过以下方式获取用户标识:

 UserProfile profile = db.UserProfiles.Where( u => u.UserName.Equals(model.UserName) ).SingleOrDefault(); 

我最近遇到这个案子,这个答案本可以节省我一大堆时间,所以把它放在那里。