如何在ASP.Net MVC中获取用户对象的用户ID?


72

我有一些表具有与aspnet_Users.UserID相关的uniqueidentifier UserID。当用户为这些表提交一些数据时,由于控制器方法具有[Authorize],因此将获得一个User对象。我可以使用User.Identity.Name获取用户名,但是如何获取UserID才能建立(所有权)关系呢?


1
这个问题与mvc确实没有任何关系,所以我从asp-net-mvc重新标记为asp-net,以吸引更多的听众观看。
克里斯(Kris)

Kris,ASP.Net MVC提供了一个我不认为ASP.Net提供的User对象。我错了吗?
2009年

2
是的,你错了。克里斯是对的。这是ASP.NET的东西,而不仅仅是ASP.NET MVC。
Pure.Krome,2009年

Answers:


86

似乎无法从User对象获取它,但是可以通过以下方式获取它:

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

真?它不需要字符串吗?/ me检查msdn:msdn.microsoft.com/en-us/library/…。嘘!你是对的!很好的发现:)
Pure.Krome

16
在已介绍的OAuth资料中,此方法无效(返回null)。在ASP.Net 4 MVC中,您可以使用WebSecurity.CurrentUserId属性
丹尼尔,

2
@Dann似乎在ASP.Net MVC 5中不再起作用,或者它们更改了using语句(正在使用System.Web.Security)。有任何想法吗?
杰德·格兰特


30

解决方法如下:

包括:

using Microsoft.AspNet.Identity;

然后使用扩展方法:

User.Identity.GetUserId();

27

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


嗯 我不太确定您如何处理系统中的用户,但这听起来像是您在使用asp.net membership provider.net开箱即用的(非常邪恶)。你说的事实暗示了这一点

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

对于使用默认FormsIdentity的默认表单身份验证系统,它只有一个名为Name的属性(如您正确指出的那样)。这意味着它只有一个值可以放置一些唯一的用户信息。对于您的情况,您要将Name / UserName / DisplayName放在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类的所有信息。

奖励答案/建议

因此,我会缓存该结果,因此您无需继续访问数据库。

... cont from above....
Guid guid = (Guid)user.ProviderUserKey;

Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.

否则,您可以创建自己的Identity类(继承自IIdentity)并添加您自己的自定义属性,例如UserID。然后,每当您进行身份验证(以及每个请求)时,都可以设置此值。无论如何,这是一个硬核解决方案,所以现在就进行缓存。

高温超导


1
那是这样做的方式吗?使用户名唯一?那么,我们到底有什么ID?
2009年

4
OT:为什么您认为ASP.NET成员资格是邪恶的?
eduncan911

5
@Eric:因为我个人认为对于大多数场景来说,这是一个过度设计的解决方案。例如,您看到多少次解决方案共享同一台sql服务器,而该用户在同一台​​sql服务器上跨数据库共享用户?所有这些表和存储的proc,对于大多数场景的人来说,都可以减少到一两个。摘要:肿胀。过度发动机。旁注:现在是OpenID FTW :)
Pure.Krome,2009年

@J。巴勃罗:没有伴侣。ID是唯一的主要事物,但是Membership.GetUser(string)通过提供的字符串获取用户->通常是其用户名。如果u不提供该字符串,则假定有人登录,它将使用当前登录者的当前值。该值等效于User.Identity.Name。
Pure.Krome,2009年

18

User.IdentityIPrincipal-通常为System.Web.Security.FormsIdentity

它对UserID一无所知-只是对“身份”概念的抽象。

IIdentity的接口只有“名称”为用户,甚至没有“用户名”。

如果您使用默认的MVC4,则SimpleMembershipProvider可以执行以下操作:

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

(在WebMatrixWebSecurity的nuget包Microsoft.AspNet.WebPages.WebData

您也可以使用

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

(如果您使用的是ASPNetMembershipProvider,它是较旧的更复杂的ASPNET成员资格系统,请参阅@ eduncan911的回答)


为+1 WebSecurity.CurrentUserId。即使模板化的AccountControllerWebSecurity.GetUserId(User.Identity.Name)CurrentUserId可用时也使用它似乎有些愚蠢。
Gone Coding

11

如果您使用的是ASP.NET成员资格(依次使用IPrincipal对象):

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

User.Identity始终返回当前用户的状态,无论是否登录。

是否匿名,等等。因此检查已登录:

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;
  }
}

6

获取用户ID的最佳选择

添加以下参考

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();

}

3

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

例如:

public class MyCustomUser : IPrincipal
{
    public int UserId {get;set;}

    //...Other IPrincipal stuff
}

这是有关创建自己的基于表单的身份验证的出色教程。

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

这样可以使您正确地为用户创建身份验证cookie并访问自定义用户数据。


2
using System.Web.Security;

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

1

其ProviderUserKey属性。

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

我如何让您成为当前的登录用户?
2009年

1

简单....

int userID = WebSecurity.CurrentUserId;

尽管它是更有用的解决方案之一,但Simon_Weaver的答案(7个月前)涵盖了此答案。
Gone Coding

0

通常,您只能使用WebSecurity.currentUserId,但是如果您在创建帐户之后就进入AccountController,并且想要使用用户ID将用户链接到其他表中的某些数据,那么WebSecurity.currentUserId(以及上面的所有解决方案),在那种情况下返回-1,所以它不起作用。

幸运的是,在这种情况下,您可以方便地使用UserProfiles表的db上下文,因此可以通过以下方式获取用户ID:

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

我最近遇到了这个案例,这个答案可以节省我很多时间,所以就把它放在那里。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.