使用令牌访问登录页面

问题描述 投票:0回答:1

我正在开发一个电子商务网站。我正在使用实体框架和 Web api,因此我正在创建一个用户层。

这是我的实体层

namespace Core.DataAccess.EntityFramework
{
    public class EfBaseRepository<TEntity, TContext> : IBaseRepository<TEntity>
        where TEntity : class, IEntity, new()
        where TContext : DbContext, new()
    {
        public async Task<TEntity> AddAsync(TEntity entity)
        {
            using (TContext context = new TContext())
            {
                await context.Set<TEntity>().AddAsync(entity);
                await context.SaveChangesAsync();
                return entity;
            }
        }

        public async Task<bool> DeleteAsync(int id)
        {
            using (TContext context = new TContext())
            {
                var deleteEntity = await context.Set<TEntity>().FindAsync(id);
                context.Set<TEntity>().Remove(deleteEntity);
                var data = await context.SaveChangesAsync();
                if (data > 0)
                    return true;
                return false;
            }
        }

        public async Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> filter)
        {
            using (TContext context = new TContext())
            {
                return await context.Set<TEntity>().SingleOrDefaultAsync(filter);
            }
        }

        public async Task<IEnumerable<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> filter = null)
        {
            using (TContext context = new TContext())
            {
                return filter == null
                    ? await context.Set<TEntity>().ToListAsync() :
                     await context.Set<TEntity>().Where(filter).ToListAsync();
            }
        }


        public async Task<TEntity> UpdateAsync(TEntity entity)
        {
            using (TContext context = new TContext())
            {
                context.Set<TEntity>().Update(entity);
                await context.SaveChangesAsync();
                return entity;
            }
        }
    }
}

这是用户控制器

namespace Bussines.Concrete
{
    public class UserService : IUserService
    {
        private readonly IUserDal _userDal;
        AppSettings _appSettings;
        IMapper _mapper;
        public UserService(IUserDal userDal, IOptions<AppSettings> appSettings, IMapper mapper)
        {
            _userDal = userDal;
            _appSettings = appSettings.Value;
            _mapper = mapper;
        }
        public async Task<ApiDataResponse<UserDto>> AddAsync(UserAddDto userAddDto)
        {
            var user = _mapper.Map<User>(userAddDto);
            user.CreatedDate = DateTime.UtcNow;
            user.CreatedUserId = 1;
            var userAdd = await _userDal.AddAsync(user);
            var userDto = _mapper.Map<UserDto>(userAdd);

            return new SuccessApiDataResponse<UserDto>(userDto, Messages.Added);
        }

        public async Task<ApiDataResponse<bool>> DeleteAsync(int id)
        {
            return new SuccessApiDataResponse<bool>(await _userDal.DeleteAsync(id), Messages.Deleted);
        }

        public async Task<ApiDataResponse<UserDto>> GetByIdAsync(int id)
        {
            var user = await _userDal.GetAsync(x => x.Id == id);
            if (user != null)
            {
                var userDto = _mapper.Map<UserDto>(user);
                return new SuccessApiDataResponse<UserDto>(userDto, Messages.Listed);
            }
            return new ErrorApiDataResponse<UserDto>(null, Messages.NotListed);
        }

        public async Task<ApiDataResponse<IEnumerable<UserDetailDto>>> GetListAsync(Expression<Func<User, bool>> filter = null)
        {
            if (filter == null)
            {
                var response = await _userDal.GetListAsync();
                var userDetailDtos = _mapper.Map<IEnumerable<UserDetailDto>>(response);
                return new  SuccessApiDataResponse<IEnumerable<UserDetailDto>>(userDetailDtos, Messages.Listed);
            }
            else
            {
                var response = await _userDal.GetListAsync(filter);
                var userDetailDtos = _mapper.Map<IEnumerable<UserDetailDto>>(response);
                return new SuccessApiDataResponse<IEnumerable<UserDetailDto>>(userDetailDtos, Messages.Listed);
            }
        }

        public async Task<ApiDataResponse<UserDto>> GetAsync(Expression<Func<User, bool>> filter = null)
        {
            var user = await _userDal.GetAsync(filter);
            if (user!= null)
            {
                var userDto= _mapper.Map<UserDto>(user);
                return new SuccessApiDataResponse<UserDto>(userDto, Messages.Listed);
            }
            return new ErrorApiDataResponse<UserDto>(null, Messages.NotListed);
        }

        public async Task<ApiDataResponse<UserUpdateDto>> UpdateAsync(UserUpdateDto userUpdateDto)
        {
            var getUser = await _userDal.GetAsync(x => x.Id == userUpdateDto.Id);
            var user = _mapper.Map<User>(userUpdateDto);
            user.CreatedDate = getUser.CreatedDate;
            user.CreatedUserId = getUser.CreatedUserId;
            user.UpdatedDate = DateTime.Now;
            user.UpdatedUserId = 1;
            user.Token = userUpdateDto.Token;
            user.TokenExpireDate = userUpdateDto.TokenExpireDate;
            var resultUpdate = await _userDal.UpdateAsync(user);
            var userUpdateMap = _mapper.Map<UserUpdateDto>(resultUpdate);

            return new SuccessApiDataResponse<UserUpdateDto>(userUpdateMap, Messages.Updated);
        }
    }
}

这是我使用身份验证控制器登录的控制器

namespace Bussines.Concrete
{
    public class AuthService : IAuthService
    {
        private IUserService _userService;
        private ITokenService _tokenService;
        private IMapper _mapper;
        public AuthService(IUserService userService, ITokenService tokenService, IMapper mapper)
        {
            _userService = userService;
            _tokenService = tokenService;
            _mapper = mapper;
        }
        public async Task<ApiDataResponse<UserDto>> LoginAsync(LoginDto loginDto)
        {
            var user = await _userService.GetAsync(x => x.UserName == loginDto.UserName && x.Password == loginDto.Password);
            if (user == null)
            {
                return new ErrorApiDataResponse<UserDto>(null, Messages.UserNotFound);
            }
            else
            {
                if (user.Data.TokenExpireDate == null || String.IsNullOrEmpty(user.Data.Token))
                {
                    var accessToken = _tokenService.CreateToken(user.Data.Id, user.Data.UserName);
                    var userUpdateDto = _mapper.Map<UserUpdateDto>(user.Data);
                    userUpdateDto.Token = accessToken.Token;
                    userUpdateDto.TokenExpireDate = accessToken.Expiration;
                    userUpdateDto.UpdatedUserId = user.Data.Id;
                    var resultUserUpdateDto = await _userService.UpdateAsync(userUpdateDto);
                    var userDto = _mapper.Map<UserDto>(resultUserUpdateDto.Data);
                    return new SuccessApiDataResponse<UserDto>(userDto, Messages.LoginSuccessful);
                }

                if (user.Data.TokenExpireDate < DateTime.Now)
                {
                    var accessToken = _tokenService.CreateToken(user.Data.Id, user.Data.UserName);
                    var userUpdateDto = _mapper.Map<UserUpdateDto>(user.Data);
                    userUpdateDto.Token = accessToken.Token;
                    userUpdateDto.TokenExpireDate = accessToken.Expiration;
                    userUpdateDto.UpdatedUserId = user.Data.Id;
                    var resultUserUpdateDto = await _userService.UpdateAsync(userUpdateDto);
                    var userDto = _mapper.Map<UserDto>(resultUserUpdateDto.Data);
                    return new SuccessApiDataResponse<UserDto>(userDto, Messages.LoginSuccessful);
                }
            }
            return new SuccessApiDataResponse<UserDto>(user.Data, Messages.LoginSuccessful);
        }


    }
}

enter image description here

当我尝试登录 api 时,它给出了如图所示的 null 错误

由于该结构是我第一次进入的结构,所以我对逻辑的把握有点困难。我认为 getlist 部分可能存在错误,但我找不到解决方案,我找不到映射端的错误,我无法确定它为何为空。

c# asp.net-core jwt
1个回答
0
投票

你的UserDto是什么?因为你的get方法是由userDto映射的。你是 dto 的 hava 数据支柱吗?

© www.soinside.com 2019 - 2024. All rights reserved.