【问题标题】:Get and edit currently authenticated user from a controller从控制器获取和编辑当前经过身份验证的用户
【发布时间】:2015-08-20 09:58:05
【问题描述】:

我正在构建一个 ASP.NET MVC 应用程序,需要获取和编辑当前登录该应用程序的用户。我使用 IdentityModel 中的构建并在 AccountController 上编写了几个 get 和 edit 方法,其方式与此处介绍的类似: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;
}

我的问题是当我尝试从另一个控制器调用它们时,在本例中是从 payments 控制器更新balance 属性:

var currentUser = await Controllers.AccountController.getCurrentUser(User.Identity.GetUserId());

因为 AccountController getCurrentUser 和 editCurrentUser 不是静态的,我无法从类中访问它们。很明显,但是 MVC 应用程序在哪里创建 AccountController 的实例以及如何访问它?

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

【问题讨论】:

    标签: c# asp.net-mvc authentication instance asp.net-identity


    【解决方案1】:

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

    [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 控制器或依赖注入创建公共基类。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 抱歉,我不太明白你建议我做什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2015-10-28
      • 2020-11-01
      • 2021-04-07
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多