簡體   English   中英

Web API中的ASP.NET 5 Identity用戶管理

[英]ASP.NET 5 Identity user management in Web API

因此,我使用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 (inclduing適當的創建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);
    }
}

我進行了一些測試,包括基於角色和聲明的身份驗證,我非常有信心現在一切都可以像預期的那樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM