首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web中的ASP.NET 5身份用户管理

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

Stack Overflow用户
提问于 2016-04-05 18:56:27
回答 1查看 2K关注 0票数 0

因此,我正在使用asp.net 5MVC6构建一个应用程序接口,并遵循Microsoft tutorial on building new web APIs开始。然后,我按照this question的回答实现了基于JWT令牌的身份验证,但我被困在这里了:

代码语言:javascript
复制
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语句,就像我在旧的MVC5API中所做的那样:

代码语言:javascript
复制
ApplicationUser user = await _userManager.FindAsync(userName, password);

我相信我实际上遗漏了UserManager的一些实现。

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

EN

回答 1

Stack Overflow用户

发布于 2016-04-17 18:22:47

我使用了相同的示例来实现基于JWT令牌的身份验证,并遇到了完全相同的问题。在执行了一些研究之后,我确信您是对的- UserManager似乎不再有验证用户名和密码的方法。

解决方案很简单,但在我看来不是很直观,这就是为什么我花了一些时间才弄明白的原因:

您可以首先使用UserManager.FindByNameAsync检查具有给定用户名的用户是否存在,然后使用UserManager.CheckPasswordAsync检查密码是否正确。

我完成的TokenController (包括创建一个适当的ClaimsIdentity,也没有在示例中介绍)如下所示:

代码语言:javascript
复制
[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);
    }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36424461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档