扩展UserManager

use*_*418 7 c# asp.net-mvc asp.net-core asp.net-core-2.0

在我的.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; }

    }
Run Code Online (Sandbox Code Playgroud)

在_LoginPartial中,我想获取Name,而不是默认获取的UserName

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

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@if (SignInManager.IsSignedIn(User))
{
     @UserManager.GetUserName(User)
}
Run Code Online (Sandbox Code Playgroud)

如何扩展UserManager,或创建一个在UserManager.GetUserName等视图中可用的新方法?

SO *_*ood 11

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

var user = await UserManager.GetUserAsync(User);
string userName = user.Name;
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到服务:

services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<SomeContext>()
    .AddUserManager<MyManager>()
    .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

然后你需要替换UserManager<ApplicationUser>for 的引用MyManager.