Пример #1
0
        public UserLoginResponse Login([FromBody]
                                       UserLoginRequest request)
        {
            try
            {
                var user = _userService.Access(request.EmailAddress, request.Password);

                var claims = new List <Claim>
                {
                    new Claim("sub", user.Id)
                };

                do
                {
                    if (!_identitySettings.AdditionalClaims.Any())
                    {
                        break;
                    }

                    var decryptedData = _userService.GetData(user.Id);
                    if (decryptedData == null)
                    {
                        break;
                    }

                    var additionalClaims = _identitySettings.AdditionalClaims;
                    var userData         = JsonConvert.DeserializeObject <User>(decryptedData);

                    foreach (var ac in additionalClaims)
                    {
                        if (!AdditionalClaims.ToUserProperty.ContainsKey(ac))
                        {
                            continue;
                        }
                        var property = AdditionalClaims.ToUserProperty[ac];
                        var value    = userData.GetType().GetProperty(property)?.GetValue(userData, null)?.ToString();
                        if (!value.IsNullOrEmpty())
                        {
                            claims.Add(new Claim(ac, value));
                        }
                    }
                } while (false);

                var roles = user.Roles;
                if (roles != null)
                {
                    claims.AddRange(roles.Select(r => new Claim("roles", r)));
                }

                var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
                identity.AddClaims(claims);

                HttpContext.User = new ClaimsPrincipal(identity);

                return(new UserLoginResponse
                {
                    UserId = user.Id
                });
            }
            catch (Exception ex)
            {
                return(new UserLoginResponse
                {
                    Success = false,
                    Message = ex.Message
                });
            }
        }