如何在非控制器类中从 Microsoft.AspNetCore.Identity 获取 UserID
Posted
技术标签:
【中文标题】如何在非控制器类中从 Microsoft.AspNetCore.Identity 获取 UserID【英文标题】:How to get UserID from Microsoft.AspNetCore.Identity in a non controller class 【发布时间】:2017-03-28 14:20:16 【问题描述】:希望有人可以在这里帮助我。我是 ASP、MVC 和 C# 的新手,但我正在尝试构建一个 Web 应用程序来学习它。我已经创建了为用户创建所有控制器、视图等的默认应用程序,并且一切正常。
我现在创建了一个类,在该类中,我需要获取登录用户的用户 ID 或用户名。我已经尝试将 UserManager 和 SignInManager 注入到类的构造函数中,但是任何调用该调用的控制器都会抱怨我没有传入所需的参数。
这可能有点厚颜无耻,但如果有人有一个基本示例说明如何从类中检索用户 ID 之类的东西,我可能会向后工作并理解发生了什么。一直在网上搜索几个小时,但找不到任何有效的示例。
使用 VS 2015 Asp Core Net RC2
谢谢
【问题讨论】:
尝试在控制器中使用this.User
【参考方案1】:
这对我有用
查看this 文章的Inside Services 部分,了解如何获取HttpContextAccessor 的实例(例如_httpContextAccessor)
那么你可以像这样获取用户ID:
long userId = ClaimsPrincipalExtensions.GetUserId(_httpContextAccessor.HttpContext.User);
假设您已经编写了方法ClaimsPrincipalExtensions.GetUserId,如果您没有,只需检查this。
【讨论】:
【参考方案2】:用户 ID 存在于 HttpContext
中。 Identity 只是添加了帮助程序,但您仍然需要 HttpContext
实例,您不会在控制器之外拥有它。这似乎是 XY 问题的一个典型例子,你在问如何以某种方式解决问题,而不是问如何解决问题本身。一般来说,如果您需要控制器之外的用户 id,您应该简单地将文字用户 id 从控制器传递到您正在调用的任何内容,而不是尝试从那里检索它。
【讨论】:
谢谢克里斯。您可能是对的,因为我可能采用了错误的方法来解决问题。这对我来说是学习过程的一部分。基本上,我需要访问从两个不同控制器调用的类中的 userId 或 UserName。我现在尝试将 UserManager 注入这些控制器,使用 userManager.GetUserAsync(HttpContext.User).Id 获取 ID 并将其传递给类,但我现在在 GetUserAsync(HttpContext.User) 中获得了一个空对象引用。 获取用户id的方式是User.Identity.GetUserId()
,需要Microsoft.AspNet.Identity
命名空间。如果您为 Identity 用户自定义了主键,那么您需要使用它的通用版本,即 User.Identity.GetUserId<T>()
其中T
是主键的类型。
如果我使用的是 Microsoft.AspNetCore.Identity 怎么办? GetUserID() 在这种情况下不存在。
其实是在***.com/users/1138946/cfreitasthis.User.FindFirstValue(ClaimTypes.NameIdentifier) 的帮助下找到的
在这里遇到同样的问题,试图从我的 UserManager 获取用户名,以用作我的 DAL 模型中的类中参数“UpdatedBy”的默认值。我不明白您将如何告诉控制器将其发送给它,并且使用您对 this.User.FindFirstValue(ClaimTypes.NameIdentifier)
的建议调用该信息不起作用,首先,删除它不喜欢用户;以及它不喜欢 ClaimTypes。以上是关于如何在非控制器类中从 Microsoft.AspNetCore.Identity 获取 UserID的主要内容,如果未能解决你的问题,请参考以下文章
在非 UIViewController 类中呈现 UIAlertController 时如何隐藏状态栏?
在自定义 UIView 类中从 UIView 快速创建 IBoutlet [重复]
在java中如何在非servlet的普通类中获取requestresponsesession