我是ASP.NET核心的新手。但是,我在ASP.NET Core 2.0中创建WebAPI。我已经配置了基于JWT Bearer Token的身份验证。下面是我的Controller返回令牌。
[AllowAnonymous]
[Route("api/[controller]")]
public class TokenController : Controller
{
private readonly UserManager<UserEntity> userManager;
private readonly SignInManager<UserEntity> signInManager;
public TokenController(UserManager<UserEntity> userManager, SignInManager<UserEntity> signInManager)
{
this.userManager = userManager;
this.signInManager = signInManager;
}
// GET: api/values
[HttpGet]
public async Task<IActionResult> Get(string username, string password, string grant_type)
{
{
var user = await userManager.FindByEmailAsync(username);
if (user != null)
{
var result =await signInManager.CheckPasswordSignInAsync(user, password, false);
if (result.Succeeded)
{
var claims = new[]
{
new Claim( JwtRegisteredClaimNames.Sub, username),
new Claim( JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim( JwtRegisteredClaimNames.GivenName, "SomeUserID")
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretesecretesecretesecretesecretesecrete"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken( issuer: "test",
audience: "test",
claims: claims,
expires: DateTime.Now.AddDays(15),
signingCredentials: creds);
return Ok(new { access_token = new JwtSecurityTokenHandler().WriteToken(token), expires_on=DateTime.Now.AddDays(15) });
}
}
}
return BadRequest("Could not create token");
}
}
但是在调用使用[Authorize]属性修饰的ValuesController API时。我收到User.Identity.Name为空。我没有收到有关用户的任何信息。我不确定,我的令牌控制器是否正确写入。只要它保护我的ValuesController,我认为,这是正确的。但是,我可能会遗漏一些东西。请帮忙。
注意:我正在使用带有Mac社区版的Visual Studio 2017进行开发
是的,您需要指定转换为user.identity.name的唯一名称的声明:
new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
我也一直在使用ASP.Net Core 2这个问题,我真的很惊讶没有人发现这个问题的其他原因。
当我的webapp部署到IIS时,“User.Identity.Name
”始终返回null。 IIS站点已禁用匿名访问,并启用了Windows身份验证。
但。
我没有意识到我的ASP.Net Core 2有一个“launchSettings.json
”文件,安静地隐藏在Properties
文件夹下,并且在那里,还有一些iisSettings,在这里,奇怪的是,“windowsAuthentication
”默认设置为false 。
将“windowsAuthentication
”更改为true,将“anonymousAuthentication
”更改为false可以解决我的问题。
执行此操作后,“User.Identity.Name
”最终包含正确的用户名。
但这个设置到底是什么?为什么这会优先于我们在IIS管理器中设置的实际设置?