从控制器获取和编辑当前经过身份验证的用户

Get and edit currently authenticated user from a controller

我正在构建一个 ASP.NET MVC 应用程序,需要获取和编辑当前登录该应用程序的用户。我使用 IdentityModel 中的构建,并以与此处介绍的类似方式在 AccountController 上编写了几个获取和编辑方法:How to get current user, and how to use User class in MVC5?

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 不是静态的,所以我无法从 class 访问它们。很明显,但是 MVC 应用程序在哪里创建 AccountController 的实例以及如何访问它?

或者,检索和修改当前用户的更好方法?

您不应该从控制器调用 getCurrentUser。 为什么不能直接调用(ApplicationUser)await UserManager.FindByIdAsync(userid);? 更好的方法 - 将您的方法与用户一起使用特殊 class(服务)并在需要调用此方法的地方引用它。

此处有多种选择。也许对你来说最直接的方法就是制作这些方法,扩展方法:

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

所以创建一个 class 比如:

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,为帐户、支付控制器或依赖项注入创建一个公共基础 class。