Web API中的ASP.NET 5身份用户管理

所以我正在使用asp.net 5 MVC 6构建api,并且我遵循了关于构建新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);
    }
}

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

链接地址: http://www.djcxy.com/p/22391.html

上一篇: ASP.NET 5 Identity user management in Web API

下一篇: ASP.NET 5 Creating RSA key,