你如何获得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.FormsIdentity
types
它不知道用户标识的任何内容 – 这只是“身份”概念的抽象。
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();
我最近遇到这个案子,这个答案本可以节省我一大堆时间,所以把它放在那里。