首页 > 解决方案 > 在 .NET 5 中将当前身份用户 ID 与 AutoMapper 一起使用

问题描述

我想知道在使用身份框架时如何访问 AutoMapper 中的当前用户 ID。

{
    public class MovieDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool HasLiked { get; set; } // indicates if the current has liked the movie
        ...
    }
}

我希望能够ClaimsPrincipal从 AutoMapper 配置文件内部访问,例如:

CreateMap<Movie, MovieDto>()
    .ForMember(dst => dst.HasLiked, opt => opt.MapFrom(src => 
               src.UserLike.Any(ul => 
               ul.UserId == User.FindFirst(ClaimTypes.NameIdentifier)?.Value));

是否可以使用 AutoMapper 实现这一目标?

如果这不可能或未指明,我应该如何以可重用的方式在我的存储库中执行此类查询?

标签: .netasp.net-identityautomapper

解决方案


在@LucianBargaoanu 发表评论后,我能够弄清楚如何正确地做到这一点,所以我决定回答以帮助其他人从.Net 开始:

创建一个currentUserId来保存用户 ID。

public class AutoMapperProfiles : Profile
{
    public AutoMapperProfiles()
    {
        string currentUserId = null;

        CreateMap<Movie, MovieDto>()
            .ForMember(dst => dst.HasLiked, opt => opt.MapFrom(src => 
                    src.UserLikes.Any(ul => ul.UserId == currentUserId)));
    }
}

使用 AutoMapper 进行投影时,currentUserId作为参数传递:

public async Task<MovieDto> GetMoviesdAsync(string userId)
{
    return await _context.Movies
        .ProjectTo<MovieDto>(_mapper.ConfigurationProvider, new { currentUserId = userId })
        .ToListAsync();
}

而且,这就是我在控制器中获取 UserId 的方式:

[HttpGet]
public async Task<ActionResult<IEnumerable<MovieDto>>> GetMovies()
{
    var userId = User.GetUserId();
    return Ok(await _unitOfWork.AuctionRepository.GetMoviesdAsync(userId));
}

这是我用来获取 UserId 的扩展方法:

public static class ClaimsPrincipleExtension
{
    public static string GetUserId(this ClaimsPrincipal user)
    {
        return user.FindFirst(ClaimTypes.NameIdentifier)?.Value;
    }
}

推荐阅读