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

pup*_*eno 72 membership asp.net

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

pup*_*eno 86

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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
Run Code Online (Sandbox Code Playgroud)

  • 在已引入的OAuth内容中,这不起作用(返回null).在ASP.Net 4 MVC中,您可以使用WebSecurity.CurrentUserId属性 (16认同)
  • **MVC 5**解决方案:http://stackoverflow.com/questions/18448637/how-to-get-current-user-and-how-to-use-user-class-in-mvc5/18451374#18451374 (9认同)
  • @Dann似乎在ASP.Net MVC 5中这不再有效,或者他们改变了使用语句(使用System.Web.Security).有任何想法吗? (2认同)

小智 30

这是解决方案:

包括:

using Microsoft.AspNet.Identity;
Run Code Online (Sandbox Code Playgroud)

然后使用扩展方法:

User.Identity.GetUserId();
Run Code Online (Sandbox Code Playgroud)


Pur*_*ome 27

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


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

  • aspnet_Users.UserID
  • UserID是uniqueidentifier(读取:GUID).

使用默认的Forms身份验证系统,它使用默认的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;
Run Code Online (Sandbox Code Playgroud)

因此,每次您希望获取用户信息时,都需要使用上面的静态方法从数据库中获取它.

阅读有关MSDN上的Membership类MembershipUser类的所有信息.

奖金回答/建议

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

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

Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.
Run Code Online (Sandbox Code Playgroud)

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

HTH

  • @Eric:因为我个人觉得这是大多数场景的大规模过度设计的解决方案.例如,您在同一个SQL服务器上看到多少次共享一个共享sql server的解决方案,其中用户在数据库之间共享?所有这些表和存储过程,对于大多数场景的人来说可以减少到一两个.总结:巨大的膨胀.过度引擎.附注:OpenID FTW现在:) (5认同)
  • OT:为什么你声称ASP.NET成员资格是邪恶的? (4认同)

Sim*_*ver 18

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

它对UserIDs一无所知 - 它只是对"身份"概念的抽象.

IIdentity的接口只有"名称"为用户,甚至没有"用户名".

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

WebSecurity.GetUserId(User.Identity.Name)   // User is on ControllerBase
Run Code Online (Sandbox Code Playgroud)

(WebMatrix WebSecurity中的nuget包Microsoft.AspNet.WebPages.WebData中的位置

你也可以使用

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId
Run Code Online (Sandbox Code Playgroud)

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


edu*_*911 11

如果您使用的是ASP.NET Membership(后者又使用IPrincipal对象):

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

User.Identity始终返回当前用户的状态,登录与否.

匿名与否等等.因此登录检查:

if (User.Identity.IsAuthenticated)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以,把它们放在一起:

using System.Web.Security;
{
  if (User.Identity.IsAuthenticated)
  {
    MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
    Guid guid = (Guid)user.ProviderUserKey;
  }
}
Run Code Online (Sandbox Code Playgroud)


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

}
Run Code Online (Sandbox Code Playgroud)