![](/img/trans.png)
[英]How to get authenticated user's name, IP address, and the controller action being called from an HTTP Filter?
[英]Get and edit currently authenticated user from a controller
我正在构建一个ASP.NET MVC应用程序,需要获取和编辑登录该应用程序的当前用户。 我使用IdentityModel中的构建,并以与此处所示类似的方式在AccountController上编码了几个get和edit方法: 如何获取当前用户,以及如何在MVC5中使用User类?
AccountController方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
我的问题是,当我尝试从另一个控制器调用它们时,在这种情况下,要从付款控制器中更新balance
属性:
var currentUser = await Controllers.AccountController.getCurrentUser(User.Identity.GetUserId());
因为AccountController getCurrentUser和editCurrentUser不是静态的,所以无法从类中访问它们。 很明显,但是MVC应用程序在哪里创建AccountController的实例,如何访问它?
或者,是否有更好的方法来检索和修改当前用户?
这里有多种选择。 也许对您来说最直接的方法是使这些方法成为扩展方法:
[NonAction]
public async Task<ApplicationUser> getCurrentUser(string userid)
{
var user = (ApplicationUser)await UserManager.FindByIdAsync(userid);
return user;
}
[NonAction]
public async Task<int> editCurrentUser(ApplicationUser user)
{
await UserManager.UpdateAsync(user);
return 1;
}
因此,创建一个像这样的类:
public static class UserManagerExtensions
{
public static async Task<ApplicationUser> getCurrentUser(this UserManager userManager, string userid)
{
var user = (ApplicationUser)await userManager.FindByIdAsync(userid);
return user;
}
public static async Task<int> editCurrentUser(this UserManager userManager, ApplicationUser user)
{
await userManager.UpdateAsync(user);
return 1;
}
}
然后从每个控制器调用这些扩展方法。 这意味着您将像在AccountController中一样注入到PaymentsController,UserManager等中。
或者,您可以使用ActionFilters,为Accounts,Payments控制器或依赖项注入创建通用基类。
您不应从控制器调用getCurrentUser。 为什么不能调用(ApplicationUser)await UserManager.FindByIdAsync(userid);
直? 更好的方法-将与用户一起使用的方法放在特殊的类(服务)中,并在需要调用此方法的场所中引用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.