你如何获得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(); 
我最近遇到这个案子,这个答案本可以节省我一大堆时间,所以把它放在那里。