如何在 Asp.net core mvc 的控制器中获取自己的用户
Posted
技术标签:
【中文标题】如何在 Asp.net core mvc 的控制器中获取自己的用户【英文标题】:How can I get my own User in controller in Asp.net core mvc 【发布时间】:2019-05-17 08:11:56 【问题描述】:我有用户类:
public class User : Entity
public void AcceptMenu(Menu menu)
//AcceptMenu
public string Login get; set;
public string Password get; set;
public string Salt get; set;
public string FirstName get; set;
public string LastName get; set;
我创建了授权逻辑。验证方法如下所示:
private async Task Authenticate(User user)
var claims = new List<Claim>
new Claim(ClaimsIdentity.DefaultNameClaimType, user.Login),
new Claim(ClaimsIdentity.DefaultRoleClaimType, user.Role)
;
ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(id));
如您所见,我在 User 中有 AcceptMenu 方法。如何在 Controller 中获取 User 并执行 AcceptMenu 方法?
【问题讨论】:
@AntonToshik,哪个函数? 【参考方案1】:Controller 具有 IPrincipal
类型的属性 User。您可以使用User.Identity.Name
获取用户名称,但它是经过身份验证的 asp.net 用户的名称。您可以将此 Authenticated 用户映射到您的用户类。
在控制器中
ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
ApplicationUser user = await UserManager.FindByEmailAsync(User.Identity.Name);
其中 ApplicationUserManager 是具有身份配置的类,而 ApplicationUser 是此类中的 IdentityUser。但它不是你的实体类派生的db用户,应该手动映射
【讨论】:
你是否建议让用户喜欢:var user = appContext.Users.Single(a => a.Login == User.Identity.Name);
?
是的,这是正确的方法,你也可以使用 [dbo].[AspNetUsers] 但它不是可扩展的方法【参考方案2】:
如果您已登录,您可以随时使用var loggedInUser = await useManager.GetUserAsync(User)
获取用户。
【讨论】:
【参考方案3】:How to get the current logged in user Id in ASP.NET Core 从 ClaimsPricipal 获取值后,您可以将该值作为参数传递。
【讨论】:
以上是关于如何在 Asp.net core mvc 的控制器中获取自己的用户的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core MVC 中读取操作方法的属性?
如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?
如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量