【问题标题】:Extending the UserManager扩展用户管理器
【发布时间】:2018-02-07 21:05:01
【问题描述】:

在我的 .NET Core 2.0 MVC 项目中,我添加了其他值来扩展 ApplicationUser

public class ApplicationUser : IdentityUser
    {
        public string Name { get; set; }
        public DateTime DateCreated { get; set; }
        public DateTime DateUpdated { get; set; }
        public DateTime LastLogin{ get; set; }

    }

在 _LoginPartial 中我想获取名称,而不是默认获取的用户名

@using Microsoft.AspNetCore.Identity
@using RioTintoQRManager.Models

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@if (SignInManager.IsSignedIn(User))
{
     @UserManager.GetUserName(User)
}

我如何扩展 UserManager,或者创建一个新方法,像 UserManager.GetUserName 一样在视图中可用?

【问题讨论】:

  • 为什么不打电话给UserManager.GetUserAsync()?.Name?您是否更愿意只检索该值以提高“效率”?

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

您的视图不需要自己调用后端服务,您应该通过@ModelViewBag/ViewData/Session 向它提供所需的所有信息。
但是,如果您需要获取当前用户,您可以使用:

var user = await UserManager.GetUserAsync(User);
string userName = user.Name;

但是,如果您想拥有自己的 UserManager,则必须这样做:

public class MyManager : UserManager<ApplicationUser>
{
    public MyManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {

    }

    public async Task<string> GetNameAsync(ClaimsPrincipal principal)
    {
        var user = await GetUserAsync(principal);
        return user.Name;
    }
}

并将其添加到服务中:

services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<SomeContext>()
    .AddUserManager<MyManager>()
    .AddDefaultTokenProviders();

那么您需要将UserManager&lt;ApplicationUser&gt; 的引用替换为MyManager

【讨论】:

  • 感谢您的帮助!! @{ var u = 等待 UserManager.GetUserAsync(User); } @u.Name
  • 我不认为你有 SetNameAsync() 的代码???我已经尝试过 ILSPY,但我无法完全理解它......
  • @Gray 好吧,Name 只是添加到ApplicationUser 的字符串属性,所以通常你会得到ApplicationUser,更新属性并将更改保存回数据库跨度>
  • 如何将更改保存回数据库?我试过打电话更新,但什么也没做。如果您查看电子邮件,它有 GetEmail() 和 SetEmail() 方法。
【解决方案2】:

感谢@Camilo-Terevinto,我能够找到解决方案。在我的 _Layout.cshtml

<span class="m-topbar__username rust-text">
   @{ var u = await UserManager.GetUserAsync(User); }
   @u.Name
 </span>

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多