C# 无法创建HttpGet控制器以使用标识查找用户详细信息
我已经创建了身份验证控制器,在那里我可以创建用于登录和注销的HttpPost,但不能创建HttpGet。我尝试的是,只有经过身份验证的用户才能点击并返回有关当前登录用户的基本信息,最低用户名为Staffid(如果有) 我创建了三个角色,即管理经理和员工C# 无法创建HttpGet控制器以使用标识查找用户详细信息,c#,asp.net-core,asp.net-web-api,asp.net-identity,C#,Asp.net Core,Asp.net Web Api,Asp.net Identity,我已经创建了身份验证控制器,在那里我可以创建用于登录和注销的HttpPost,但不能创建HttpGet。我尝试的是,只有经过身份验证的用户才能点击并返回有关当前登录用户的基本信息,最低用户名为Staffid(如果有) 我创建了三个角色,即管理经理和员工 namespace Web.Controllers { [Route("api/[controller]")] [ApiController] public class AuthenticationCo
namespace Web.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : ControllerBase
{
private readonly UserManager<User> userManager;
private readonly SignInManager<User> signInManager;
public object DefaultAuthenticationTypes { get; private set; }
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
});
}
[HttpGet]
[Authorize]
public async Task<string> GetUserProfile()
{
var userName = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);
var userId = userName.Id;
var roleId = User.IsInRole("Staff");
if (!(roleId.ToString() == "Staff"))
{
return userName.ToString();
}
return userId.ToString();
}
[HttpPost("logout")]
public async Task<ActionResult> logout()
{
await signInManager.SignOutAsync();
return Ok();
}
}
}
名称空间Web.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类身份验证控制器:ControllerBase
{
私有只读用户管理器用户管理器;
专用只读SignInManager SignInManager;
公共对象DefaultAuthenticationTypes{get;private set;}
公共身份验证控制器(UserManager UserManager、SignInManager SignInManager)
{
this.userManager=userManager;
this.signInManager=signInManager;
}
[HttpPost(“登录”)]
公共异步任务登录(登录到dto)
{
var user=await userManager.FindByNameAsync(dto.UserName);
if(user==null)
{
返回请求();
}
var password=await-signInManager.CheckPasswordSignInAsync(user,dto.password,true);
如果(!password.successed)
{
返回请求();
}
等待signInManager.SignInAsync(用户,false,“密码”);
返回Ok(新用户数据到
{
UserName=user.UserName
});
}
[HttpGet]
[授权]
公共异步任务GetUserProfile()
{
var userName=await userManager.FindByNameAsync(HttpContext.User.Identity.Name);
var userId=userName.Id;
var roleId=User.IsInRole(“Staff”);
如果(!(roleId.ToString()=“Staff”))
{
返回userName.ToString();
}
返回userId.ToString();
}
[HttpPost(“注销”)]
公共异步任务注销()
{
等待signInManager.SignOutAsync();
返回Ok();
}
}
}
如果您想使用HttpGet,下面是一个演示:
登录:
查看(在表单上使用method=“get”:
我通过以下方式解决了此问题:
[HttpGet]
[Authorize]
public async Task<object> GetUserProfile()
{
var userName = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);
var userId = userName.Id;
var role = await userManager.GetRolesAsync(userName);
if (User.IsInRole("Staff"))
{
return Ok(new
{
userName,
userId
});
}
return Ok(new
{
userName,
role
});
[HttpGet]
[授权]
公共异步任务GetUserProfile()
{
var userName=await userManager.FindByNameAsync(HttpContext.User.Identity.Name);
var userId=userName.Id;
var role=await userManager.GetRolesAsync(用户名);
if(User.IsInRole(“Staff”))
{
返回Ok(新的
{
用户名,
用户ID
});
}
返回Ok(新的
{
用户名,
角色
});
您是否尝试过类似于findbyemailsync
public class InputModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
<form id="account" method="get" asp-controller="Home" asp-action="Login">
<h4>Use a local account to log in.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Input.Email"></label>
<input asp-for="Input.Email" class="form-control" />
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.Password"></label>
<input asp-for="Input.Password" class="form-control" />
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
<div class="form-group">
<div class="checkbox">
<label asp-for="Input.RememberMe">
<input asp-for="Input.RememberMe" />
@Html.DisplayNameFor(m => m.Input.RememberMe)
</label>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Log in</button>
</div>
</form>
var info = await _userManager.GetUserAsync(HttpContext.User);
[HttpGet]
[Authorize]
public async Task<object> GetUserProfile()
{
var userName = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);
var userId = userName.Id;
var role = await userManager.GetRolesAsync(userName);
if (User.IsInRole("Staff"))
{
return Ok(new
{
userName,
userId
});
}
return Ok(new
{
userName,
role
});