ASP.NET Identity 2.0中如何获取当前用户ID

93

我刚刚开始使用新的2.0版本的Identity Framework。在1.0中,我可以通过使用manager.FindByIdAsync(User.Identity.GetUserId())来获取用户对象。但在2.0中,GetUserId()方法似乎已不存在。

现在我唯一能想到的方法是使用manager.FindByEmailAsync(User.Identity.Name),它引用了用户表中的用户名字段。在我的应用程序中,这个字段设置为与电子邮件字段相同。

我可以看出这会在未来导致问题,当有人需要更新他们的电子邮件时。在Identity 2.0 Framework中,是否有一种基于不变值(如id字段)获取当前已登录用户对象的方法?


你是怎么获取 UserId 的?能告诉我一下吗?我也遇到了同样的问题。 - Ammar Khan
5个回答

121

GetUserId() 是一个扩展方法,它存在于 Microsoft.AspNet.Identity.IdentityExtensions 类中,该类针对 IIdentity 进行了扩展。请确保已添加命名空间 using Microsoft.AspNet.Identity;.


参见:https://dev59.com/UmEi5IYBdhLWcg3w0PCQ - Chris Patterson
3
似乎在Identity 2上无法正常工作。请问有什么建议? - Ammar Khan
2
应该还在。我现在在我的Identity 2项目中使用GetUserId()。 - Anthony Chu
4
在 Identity 3.0 中,这似乎已经移至 System.Security.Principal 命名空间。 - Sam
好的,从beta4开始,它似乎现在在System.Security.Claims中,并适用于ClaimsPrincipal而不是身份。 - Sam
显示剩余2条评论

64
为了在Asp.net Identity 2.0中获取当前用户ID,首先需要导入Microsoft.AspNet.Identity

C#:

using Microsoft.AspNet.Identity;

VB.NET:

Imports Microsoft.AspNet.Identity


然后在需要的地方调用User.Identity.GetUserId()

strCurrentUserId = User.Identity.GetUserId()

该方法返回数据库中用户ID字段的定义数据类型作为当前用户ID(默认为 String)。


2
请问您知道在哪里可以找到 Microsoft.AspNet.Identity 命名空间对应的 DLL 文件吗? - Franziee

17

以防万一,如果您和我一样,用户实体的Id字段是一个整数或其他不是字符串的类型,

using Microsoft.AspNet.Identity;

int userId = User.Identity.GetUserId<int>();

可以解决问题


7

我使用声明(Claims)来获取已登录用户的userId、username和email。

            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // will give the user's userId
        //userName = User.FindFirstValue(ClaimTypes.Name); // will give the user's userName
        //email = User.FindFirstValue(ClaimTypes.Email);

6

我遇到了同样的问题。我目前正在使用Asp.net Core 2.2。我用以下代码解决了这个问题。

using Microsoft.AspNetCore.Identity;
var user = await _userManager.FindByEmailAsync(User.Identity.Name);

我希望这对某些人有用。


1
这会造成不必要的数据库调用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接