因此,我正在使用asp.net 5 MVC 6构建一个api,并按照Microsoft关于构建新web api的教程开始。然后,我按照这个问题的答案来实现基于JWT令牌的身份验证,但我被困在这里:
if ((req.username == "TEST" && req.password == "TEST") || (req.username == "TEST2" && req.password == "TEST"))
{
DateTime? expires = DateTime.UtcNow.AddMinutes(2);
var token = GetToken(req.username, expires);
return new { authenticated = true, entityId = 1, token = token, tokenExpires = expires };
}
代替这个if
语句,我需要以某种方式调用UserManager
类,并检查用户名和密码是否与数据库中的用户匹配,就像我在旧的MVC 5 API中使用所做的那样
ApplicationUser user = await _userManager.FindAsync(userName, password);
我相信我实际上错过了UserManager
的一些实现。
我正在处理一个已经有用户使用Identity 2.0创建的现有数据库。我对ASP。NET 5是有限的,所以我一直在遵循各种指南和教程。
我使用了相同的示例来实现基于JWT令牌的身份验证,但遇到了完全相同的问题。经过一些研究,我确信你是对的——UserManager
似乎不再有验证用户名和密码的方法了。
解决方案很简单,但在我看来不是很直观,这就是为什么我花了一些时间才弄清楚:
您可以首先使用UserManager.FindByNameAsync
检查具有给定用户名的用户是否存在,然后使用UserManager.CheckPasswordAsync
检查正确的密码。
我完成的TokenController
(包括创建一个适当的ClaimsIdentity
,这个例子也没有涉及到)看起来是这样的:
[Route("api/[controller]")]
public class TokenController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly TokenAuthOptions _tokenOptions;
public TokenController(TokenAuthOptions tokenOptions, UserManager<ApplicationUser> userManager)
{
_tokenOptions = tokenOptions;
_userManager = userManager;
}
public class AuthRequest
{
public string Username { get; set; }
public string Password { get; set; }
}
[HttpPost]
public async Task<dynamic> Post([FromBody] AuthRequest req)
{
var user = await _userManager.FindByNameAsync(req.Username);
if (await _userManager.CheckPasswordAsync(user, req.Password))
{
DateTime? expires = DateTime.UtcNow.AddMinutes(2);
var token = GetToken(req.Username, expires, user);
return new { authenticated = true, entityId = user.Id, token = token, tokenExpires = expires };
}
return new { authenticated = false };
}
private async Task<string> GetToken(string userName, DateTime? expires, ApplicationUser user)
{
var handler = new JwtSecurityTokenHandler();
var securityToken = handler.CreateToken(
issuer: _tokenOptions.Issuer,
audience: _tokenOptions.Audience,
signingCredentials: _tokenOptions.SigningCredentials,
subject: new ClaimsIdentity(await _userManager.GetClaimsAsync(user)),
expires: expires
);
return handler.WriteToken(securityToken);
}
}
我做了一些测试,包括基于角色和声明的身份验证,我很有信心现在一切都能正常工作。