Передать данные пользователя после успешного входа в систему. От удостоверения asp. net core 3.1. - PullRequest
1 голос
/ 02 мая 2020

Мне было интересно, как передать сведения о пользователе, когда ответ на знак пользователя равен 200. Я использую Asp. net идентификатор ядра, вот мой код для контроллера httpPost для аутентификации: он отправляет имя пользователя только при входе пользователя с ответом 200.

namespace Test.Controllers
{
    [Route("/api/authentication/")]
    [ApiController]
    public class AuthenticationController : ControllerBase
    {
        private readonly UserManager<User> userManager;
        private readonly SignInManager<User> signInManager;
        public AuthenticationController(UserManager<User> userManager, SignInManager<User> signInManager)
        {
            this.userManager = userManager;
            this.signInManager = signInManager;
        }
        [HttpPost("login")]
        public async Task<ActionResult<UserDTO>> Login(LoginDTO dto)
        {

            var user = await userManager.FindByNameAsync(dto.UserName);



            if (user == null)
            {
                return BadRequest();
            }
            var password = await signInManager.CheckPasswordSignInAsync(user, dto.Password, true);
            if (!password.Succeeded)
            {
                return BadRequest();
            }
            await signInManager.SignInAsync(user, false, "Password");


            return Ok(new UserDTO { UserName = user.UserName });
        }
        [HttpPost("logout")]
        public async Task<ActionResult> logout()
        {
            await signInManager.SignOutAsync();
            return Ok();
        }


    }
}

Я хочу получить всю пользовательскую информацию, а не только userName, которая находится в UserDTO.cs при входе пользователя с ответом 200.

namespace Test.Features.Users
{
    public class UserDTO
    {
        public string UserName { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public string Password { get; set; }
        public string Role { get; set; }
    }
}

Вот мое создание контроллер аккаунта

namespace Test.Controllers
{
    [Route("api/createaccount")]
    [ApiController]
    public class CreateAccountController : ControllerBase
    {
        private readonly DataContext dataContext;
        private readonly SignInManager<User> signInManager;
        private readonly UserManager<User> userManager;
        public CreateAccountController(DataContext dataContext, SignInManager<User> signInManager, UserManager<User> userManager)
        {
            this.dataContext = dataContext;
            this.signInManager = signInManager;
            this.userManager = userManager;
        }

        [HttpPost]
        public async Task<ActionResult<UserDTO>> CreateUser(CreateAccountDTO dto)
        {   
            var newuser = new User
            {
                UserName = dto.UserName,
                Email = dto.Email,
                PhoneNumber = dto.PhoneNumber, 

            };

            using (var transaction = await dataContext.Database.BeginTransactionAsync())
            {
                var identityresults = await userManager.CreateAsync(newuser, dto.Password);

                if (!identityresults.Succeeded) 
                {
                    return BadRequest();
                }

                var roleresults = await userManager.AddToRoleAsync(newuser, Roles.Customer);


                if (!roleresults.Succeeded)
                {
                    return BadRequest();
                }

                transaction.Commit();

                await signInManager.SignInAsync(newuser, isPersistent: false);

                var user = await userManager.FindByEmailAsync(newuser.Email);


                var rolesList = await userManager.GetRolesAsync(user);

                var getRole = rolesList[0];

                Console.WriteLine(getRole);

                return Created(string.Empty, new UserDTO
                {
                    UserName = newuser.UserName,
                    Email = newuser.Email,
                    PhoneNumber = newuser.PhoneNumber,
                    Password = newuser.PasswordHash,
                    Role = getRole
                }) ;
            }
        }
    }
}

для роли у меня есть role.cs и role.cs

namespace Test.Features.Roles
{
    public class Roles
    {
        public const string Admin = nameof(Admin);
        public const string Customer = nameof(Customer);

        private static bool HasAnyRole(ClaimsPrincipal user, string target)
        {
            foreach(var role in target.Split(","))
            {
                if (user.IsInRole(role))
                {
                    return true;
                }

            }
            return false;
        }


    }
}

namespace Test.Features.Roles
{
    public class Role:IdentityRole<int>
    {
        public virtual ICollection<UserRole> Users { get; set; } = new List<UserRole>();
    }
}

спасибо!

1 Ответ

1 голос
/ 02 мая 2020

Так что вам нужно использовать UserManager для этого. Если вы посмотрите на то, что я возвращаю, это то, что вы хотите. Я проверил это, и это работает мой конец. Любые вопросы, дайте мне знать.

Для ролей пользователь может иметь несколько ролей, а приведенный ниже метод возвращает список ролей.

var roles = await _userManager.GetRolesAsync( test );

Таким образом, ваш UserDTO будет выглядеть следующим образом:

 public class UserDTO
{
    public string UserName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string Password { get; set; }
    public List<string> Role { get; set; }
}

И ваш метод контроллера будет выглядеть следующим образом:

[Route("/api/authentication/")]
[ApiController]
public class AuthenticationController : ControllerBase
{
    private readonly UserManager<User> userManager;
    private readonly SignInManager<User> signInManager;
    public AuthenticationController(UserManager<User> userManager, SignInManager<User> signInManager)
    {
        this.userManager = userManager;
        this.signInManager = signInManager;
    }
    [HttpPost("login")]
    public async Task<ActionResult<UserDTO>> Login(LoginDTO dto)
    {

        var user = await userManager.FindByNameAsync(dto.UserName);
        var roles = await _userManager.GetRolesAsync( user );
        if (user == null)
        {
            return BadRequest();
        }
        var password = await signInManager.CheckPasswordSignInAsync(user, dto.Password, true);
        if (!password.Succeeded)
        {
            return BadRequest();
        }
        await signInManager.SignInAsync(user, false, "Password");


        return Ok(new UserDTO { UserName = user.UserName, Email = user.Email, PhoneNumber = user.PhoneNumber, Password = user.PasswordHash, Role = roles.ToList() });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...