如何在ASP.Net MVC中获取User对象的UserID?

时间:2009-05-29 06:45:14

标签: asp.net membership

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

11 个答案:

答案 0 :(得分:86)

看来你无法从User对象中获取它,但你可以这样得到它:

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

答案 1 :(得分:30)

以下是解决方案:

包括:

using Microsoft.AspNet.Identity;

然后使用扩展方法:

User.Identity.GetUserId();

答案 2 :(得分:27)

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


嗯。我不太确定你是如何在你的系统中处理你的用户的,但听起来你使用的是带有.net的开箱即用的(非常邪恶的)asp.net membership provider。你说的是

这暗示了这一点
  • aspnet_Users.UserID
  • UserID是uniqueidentifier(读取: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 classMembershipUser class的所有内容。

奖金回答/建议

因此,我会CACHE结果,所以你不需要继续点击数据库。

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

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

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

HTH

答案 3 :(得分:18)

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

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

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的答案)

答案 4 :(得分: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;
  }
}

答案 5 :(得分: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();

}

答案 6 :(得分: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并访问自定义用户数据的正确途径。

答案 7 :(得分:2)

using System.Web.Security;

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

答案 8 :(得分:1)

它的ProviderUserKey属性。

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

答案 9 :(得分:1)

简单....

int userID = WebSecurity.CurrentUserId;

答案 10 :(得分:0)

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

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

WebSecurity.currentUserId

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