コード例 #1
0
        public async Task <LoginResultModel> Login(LoginModel model)
        {
            var errors = new Dictionary <string, string>();
            var user   = await _userPasswordStore.FindByNameAsync(model.UserName, new CancellationToken());

            if (user != null)
            {
                var password = await _userPasswordStore.GetPasswordHashAsync(user, new CancellationToken());

                if (_passwordHasher.VerifyHashedPassword(user, password, model.UserName.ToLower() + model.Password) == PasswordVerificationResult.Success)
                {
                    var clientId    = Guid.NewGuid().ToString();
                    var loginResult = new LoginResultModel
                    {
                        Succeeded   = true,
                        Errors      = null,
                        LoginedUser = new LoginUserInfo()
                        {
                            UserName = user.UserName,
                            UserId   = user.UserId.ToString(),
                            Roles    = user.Roles,
                            Title    = user.Title
                        }
                    };
                    var tokenHandler = new JwtSecurityTokenHandler();
                    var key          = Encoding.ASCII.GetBytes(_config.Secret);

                    var claims = new ClaimsIdentity(new Claim[]
                    {
                        new Claim(ClaimTypes.Name, loginResult.LoginedUser.UserName),
                        new Claim("UserId", loginResult.LoginedUser.UserId),
                        new Claim("ClientId", clientId)
                    });
                    if (loginResult.LoginedUser.Roles != null)
                    {
                        claims.AddClaims(loginResult.LoginedUser.Roles.Select(role => new Claim(ClaimTypes.Role, role.ToString())));
                    }
                    var tokenDescriptor = new SecurityTokenDescriptor
                    {
                        Subject            = claims,
                        Expires            = DateTime.UtcNow.AddDays(7),
                        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
                    };
                    var token = tokenHandler.CreateToken(tokenDescriptor);
                    loginResult.Token = tokenHandler.WriteToken(token);

                    return(loginResult);
                }
                else
                {
                    errors.Add("INVALID_LOGIN", "INVALID_LOGIN");
                }
            }
            else
            {
                errors.Add("INVALID_LOGIN", "INVALID_LOGIN");
            }

            return(new LoginResultModel
            {
                Succeeded = false,
                Errors = errors,
                LoginedUser = null
            });
        }