使用 .NET Core Web API 登录和注册

Posted

技术标签:

【中文标题】使用 .NET Core Web API 登录和注册【英文标题】:Login and Registration using in .NET Core Web API 【发布时间】:2018-01-31 03:11:52 【问题描述】:

我正在 Asp.Net Web API Core 1.1 中实现身份验证和授权角色库。我正在使用 JWT 令牌来生成令牌并验证请求,但我坚持将用户名和密码与 Identity 的现有数据库默认生成的表相匹配。如何将密码与 PasswordHash 匹配并注册新用户。在 .Net Core 1.1 中实现登录和注册 api 的任何示例吗?

【问题讨论】:

【参考方案1】:

您可以使用UserManager 通过方法创建新用户public virtual Task<IdentityResult> CreateAsync(TUser user, string password) 和 SignInManager 使用给定密码登录,使用方法:public virtual Task<SignInResult> PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure)

【讨论】:

【参考方案2】:
[HttpPost]
    public async Task<IActionResult> Register([FromBody]UserModel model)
    

        IdentityResult result;

        if (!ModelState.IsValid) return BadRequest(ModelState);

        var user = new ApplicationUser  UserName = model.UserName, Email = model.UserName ;

             result = await _userManager.CreateAsync(user, model.Password);

        if (! result.Succeeded) return  BadRequest(ModelState);

        return Ok(new userCreated=true, userName= model.UserName );
    

 [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody]UserModel loginViewModel)
    
        if (ModelState.IsValid)
        
            var userFound = await _userManager.FindByNameAsync(loginViewModel.UserName);

            if (userFound == null) return Unauthorized();

            var userId = userFound?.Id;

            // Claims, we endow this user
            var claims = new[]
            

            new Claim(Helpers.Constants.Strings.JwtClaimIdentifiers.Id, userId),
            new Claim(Helpers.Constants.Strings.JwtClaimIdentifiers.Rol, Helpers.Constants.Strings.JwtClaims.ApiAccess),
            new Claim("test2", "test2")
         ;


            // Get options from app settings
            var options = _configuration.GetSection(nameof(JwtIssuerOptions));

            SymmetricSecurityKey _signingKey =  new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration["SecretKey"]));

            // Configure JwtIssuerOptions


            var token = new JwtSecurityToken
            (
                issuer: options[nameof(JwtIssuerOptions.Issuer)],
                audience: options[nameof(JwtIssuerOptions.Audience)],
                claims: claims,
                expires: DateTime.UtcNow.AddMinutes(60), // token works 1 hour! (then invalidates)
                notBefore: DateTime.UtcNow,
                signingCredentials: new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256)
            );

            return Ok(new  token = new JwtSecurityTokenHandler().WriteToken(token) );
        

        return BadRequest();
    

【讨论】:

以上是关于使用 .NET Core Web API 登录和注册的主要内容,如果未能解决你的问题,请参考以下文章

将 .Net Core Identity 和 OIDC 与多个 .Net Core Web API 结合使用

.Net Core Web API User.Identity.Name 为空 [重复]

使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新令牌

如何使用 Web Api Asp.Net Core 实现基于声明的授权?

Asp.net core 3.1 保护 API 和 Web 应用程序

ASP.NET Core Web Api之JWT