73

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

4

11 回答 11

87

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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
于 2009-05-29T19:58:07.093 回答
31

这是解决方案:

包括:

using Microsoft.AspNet.Identity;

然后使用扩展方法:

User.Identity.GetUserId();
于 2014-01-30T12:55:56.593 回答
27

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


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

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

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

从中,您可以获取用户的 guid。

看一下这个。

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. 然后,每当您进行身份验证(以及每个请求)时,您都可以设置此值。无论如何,这是一个硬核解决方案,所以现在就使用缓存。

高温高压

于 2009-05-29T12:36:28.203 回答
18

User.IdentityIPrincipal- 通常是类型System.Web.Security.FormsIdentity

它对用户 ID 一无所知——它只是“身份”概念的抽象。

IIdentity界面只有用户的“名称”,甚至没有“用户名”。

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

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

(WebMatrixWebSecurity中的 nuget 包在哪里Microsoft.AspNet.WebPages.WebData

你也可以使用

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

(如果您使用的是旧的更复杂的 ASPNET 会员系统ASPNetMembershipProvider,请查看@eduncan911 的答案)

于 2013-01-17T03:08:00.190 回答
11

如果您使用的是 ASP.NET Membership(它又使用 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;
  }
}
于 2009-05-29T20:08:04.887 回答
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();

}
于 2014-01-09T02:39:30.387 回答
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 并访问您的自定义用户数据。

于 2009-05-29T14:39:01.153 回答
2
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
于 2014-02-27T18:08:26.670 回答
1

它的 ProviderUserKey 属性。

System.Web.Security.MembershipUser u;
u.ProviderUserKey
于 2009-05-29T07:17:26.180 回答
1

简单的....

int userID = WebSecurity.CurrentUserId;
于 2013-08-05T09:54:05.607 回答
0

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

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

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

我最近遇到了这个案例,这个答案会为我节省一大堆时间,所以把它放在那里。

于 2015-12-15T10:55:25.930 回答