【问题标题】:ASP.NET 5 Identity user management in Web APIASP.NET 5 Web API 中的身份用户管理
【发布时间】:2016-07-25 06:45:59
【问题描述】:

所以我正在使用 asp.net 5 MVC 6 构建一个 api,并按照 Microsoft tutorial on building new web APIs 开始。然后我按照this question 的答案实现了基于 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 };

}

我需要以某种方式调用UserManager 类,而不是这个if 语句,并检查用户名和密码是否真的与我的数据库中的用户匹配,就像我在旧的MVC 5 API 中所做的那样:

ApplicationUser user = await _userManager.FindAsync(userName, password);

我相信我实际上缺少UserManager 的一些实现。

我正在处理一个现有数据库,该数据库已经有使用 Identity 2.0 创建的用户。我对 ASP.NET 5 的了解有限,所以我一直在关注各种指南和教程。

【问题讨论】:

    标签: c# asp.net asp.net-web-api asp.net-identity jwt


    【解决方案1】:

    我使用相同的示例来实现基于 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);
        }
    }
    

    我做了一些测试,包括基于角色和声明的身份验证,我非常有信心现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2014-08-08
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多