Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从identity asp.net core 3.1成功登录后传递用户详细信息_C#_Asp.net Core_Authentication_Asp.net Identity - Fatal编程技术网

C# 从identity asp.net core 3.1成功登录后传递用户详细信息

C# 从identity asp.net core 3.1成功登录后传递用户详细信息,c#,asp.net-core,authentication,asp.net-identity,C#,Asp.net Core,Authentication,Asp.net Identity,我想知道当用户签名响应为200时如何传递用户详细信息。我正在使用Asp.net core identity,以下是用于验证的httpPost控制器的代码: 它仅在用户以响应200登录时发送用户名 namespace Test.Controllers { [Route("/api/authentication/")] [ApiController] public class AuthenticationController : ControllerBase {

我想知道当用户签名响应为200时如何传递用户详细信息。我正在使用Asp.net core identity,以下是用于验证的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();
        }


    }
}
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
                }) ;
            }
        }
    }
}
名称空间测试.控制器
{
[路由(“api/CreateCount”)]
[ApiController]
公共类CreateAccountController:ControllerBase
{
私有只读数据上下文数据上下文;
专用只读SignInManager SignInManager;
私有只读用户管理器用户管理器;
公共CreateAccountController(DataContext DataContext、SignInManager SignInManager、UserManager UserManager)
{
this.dataContext=dataContext;
this.signInManager=signInManager;
this.userManager=userManager;
}
[HttpPost]
公共异步任务CreateUser(CreateAccountDTO dto)
{   
var newuser=新用户
{
UserName=dto.UserName,
Email=dto.Email,
PhoneNumber=dto.PhoneNumber,
};
使用(var transaction=await dataContext.Database.BeginTransactionAsync())
{
var identityresults=await userManager.CreateAsync(newuser,dto.Password);
如果(!identityresults.Successed)
{
返回请求();
}
var roleresults=await userManager.AddToRoleAsync(newuser,Roles.Customer);
如果(!roleresults.successed)
{
返回请求();
}
Commit();
等待signInManager.SignInAsync(新用户,isPersistent:false);
var user=await userManager.findbyemailsync(newuser.Email);
var rolesList=await userManager.GetRolesAsync(用户);
var getRole=rolesList[0];
Console.WriteLine(getRole);
已创建的返回(string.Empty,new UserDTO)
{
UserName=newuser.UserName,
Email=newuser.Email,
PhoneNumber=newuser.PhoneNumber,
Password=newuser.PasswordHash,
Role=getRole
}) ;
}
}
}
}
角色 我有role.cs和roles.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>();
    }
}
namespace Test.Features.Roles
{
公共类角色
{
public const string Admin=nameof(Admin);
public const string Customer=nameof(客户);
私有静态bool HasAnyRole(ClaimsPrincipal用户,字符串目标)
{
foreach(target.Split(“,”)中的var角色)
{
if(user.IsInRole(角色))
{
返回true;
}
}
返回false;
}
}
}
命名空间Test.Features.Roles
{
公共类角色:IdentityRole
{
公共虚拟ICollection用户{get;set;}=new List();
}
}

谢谢大家!

因此,您需要使用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() });
    }
公共类UserDTO
{
公共字符串用户名{get;set;}
公共字符串电子邮件{get;set;}
公共字符串PhoneNumber{get;set;}
公共字符串密码{get;set;}
公共列表角色{get;set;}
}
您的控制器方法如下所示:

 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() });
    }
[路由(“/api/authentication/”)
[ApiController]
公共类身份验证控制器:ControllerBase
{
私有只读用户管理器用户管理器;
专用只读SignInManager SignInManager;
公共身份验证控制器(UserManager UserManager、SignInManager SignInManager)
{
this.userManager=userManager;
this.signInManager=signInManager;
}
[HttpPost(“登录”)]
公共异步任务登录(登录到dto)
{
var user=await userManager.FindByNameAsync(dto.UserName);
var roles=await\u userManager.GetRolesAsync(用户);
if(user==null)
{
返回请求();
}
var password=await-signInManager.CheckPasswordSignInAsync(user,dto.password,true);
如果(!password.successed)
{
返回请求();
}
等待signInManager.SignInAsync(用户,false,“密码”);
返回Ok(newuserdto{UserName=user.UserName,Email=user.Email,PhoneNumber=user.PhoneNumber,Password=user.PasswordHash,Role=roles.ToList()});
}

我们如何返回角色?我可以看到它只返回用户名、电子邮件、电话号码和密码。它显示角色的错误。错误是“角色”在当前数据库中不存在context@Hatpe123这与作用域有关。您是否准确地复制了代码?现在它表示无法将type
system.collections.generic.list隐式转换为string
@Hatpe123 Hmm这很奇怪,因为它对我有效。它为我返回的json是:{“角色”:[“测试”]}