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

我有一些表,它们具有与 aspnet _ Users 相关的 uniqueIdentiderUserID。用户名。当用户为这些表提交一些数据时,因为控制器方法有一个[ Authorize ] ,所以我得到一个 User 对象。我可以得到用户的用户名。身份。名称,但是如何让 UserID 能够建立(所有权)关系呢?

84277 次浏览

它是 ProviderUserKey 属性。

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

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


嗯。我不太确定您是如何处理您的系统中的用户的,但它听起来像您使用(非常邪恶的) asp.net membership provider,出来的盒子与。网。你说过

  • Aspnet _ Users. UserID
  • UserID 是一个惟一标识符(即 GUID)。

对于使用默认 表格识别的默认表单身份验证系统,它只有一个名为 姓名的属性(正如您正确指出的那样)。这意味着它只有一个值来放置一些独特的用户信息。在您的示例中,将 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;

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

在 MSDN 上阅读有关 会员类MembershipUser 类的所有内容。

额外回答/建议

因此,我会 CACHE 的结果,所以你不需要不断打数据库。

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


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

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

高温

如果您使用自己的 IPrime 对象进行授权,那么只需要对其进行强制转换就可以访问 Id。

例如:

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


//...Other IPrincipal stuff
}

这里有一个关于创建自己的基于 Form 的身份验证的很棒的教程。

Http://www.codeproject.com/kb/web-security/aspnetcustomauth.aspx

这将使您走上为用户创建身份验证 Cookie 并访问自定义用户数据的正确道路。

看起来你不能从 User 对象得到它,但是你可以这样得到它:

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

如果您正在使用 ASP.NET 成员资格(它反过来又使用 IPrime 对象) :

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

User.IdentityIPrincipal-典型的 System.Web.Security.FormsIdentity类型

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

身份证接口只为用户提供“ Name”,甚至没有“ Username”。

如果你使用默认 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查看答案)

很简单。

int userID = WebSecurity.CurrentUserId;

获取用户 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();


}

解决办法如下:

包括:

using Microsoft.AspNet.Identity;

然后使用扩展方法:

User.Identity.GetUserId();
using System.Web.Security;


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

通常你可以只使用 WebSecurity.currentUserId,但是如果你在 AccountController 中的帐户刚刚被创建,你想使用用户 ID 来链接用户到其他表中的一些数据,然后 WebSecurity.currentUserId(和上面所有的解决方案) ,不幸的是,在这种情况下返回 -1,所以它不工作。

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

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

我最近碰到这个案子,这个答案可以帮我节省很多时间,所以就直说了吧。