private async Task <TblIdentityCredential> ValidatePassword(AuthenticateCredentialQuery request, AuthorizeBy authorizeBy, TblIdentityCredential credential, CancellationToken cancellationToken) { if (authorizeBy == AuthorizeBy.Token) { return(credential); } var hashPassword = Encoding.ASCII.GetString(credential.PasswordByte); return(!BCrypt.Net.BCrypt.Verify(request.Password, hashPassword) ? null : credential); }
public async Task <QueryResponse <AuthorizeIdentityResponse> > Handle(AuthenticateCredentialQuery request, CancellationToken cancellationToken) { var credential = await ValidateAuthorization(request, cancellationToken, request.AuthorizeBy); if (credential == null) { return(new() { Message = $"Identity does not exist", HttpStatusCode = HttpStatusCode.NotFound }); } var cuid = new Guid(credential.Guid); credential = await ValidatePassword(request, request.AuthorizeBy, credential, cancellationToken); if (credential == null) { //_recordsService.NewAuthorizationLog(AuthenticationState.WrongPassword, cuid); return(new() { Message = $"Identity Authentication Failed", HttpStatusCode = HttpStatusCode.BadRequest }); } var roleList = await GetRoleList(cancellationToken, credential, cuid); var token = await _jwtService.GenerateToken(request.Username, cuid, roleList.Select(i => i.RoleEntityId).Adapt <List <RoleEntity> >()); //_recordsService.NewAuthorizationLog(AuthenticationState.Success, cuid); return(new() { Message = $"Identity Authorized", HttpStatusCode = HttpStatusCode.Accepted, Response = new() { AccessToken = token.AccessToken, RefreshToken = token.RefreshToken, IdentityGuid = Guid.Parse(credential.IdentityInfo.Guid), CredentialGuid = Guid.Parse(credential.Guid), RoleList = roleList.Adapt <List <RoleResponse> >() } }); }
private async Task <TblIdentityCredential> ValidateAuthorization(AuthenticateCredentialQuery request, CancellationToken cancellationToken, AuthorizeBy authorizeBy) { TblIdentityCredential result; reAuth: switch (authorizeBy) { case AuthorizeBy.Default: var application = await GetApplication(request.RequestServer.ApplicationId); var getDefaults = await _dataLayer.TblConfigurations .AsNoTracking() .FirstOrDefaultAsync(i => i.ApplicationId == application.Id & i.Key == "DefaultAuthorizeBy", cancellationToken: cancellationToken); if (getDefaults is null) { throw new ArgumentException($"Unable to login: Application with Guid '{application.Guid}' does not have 'DefaultAuthorizeBy' key in registry"); } authorizeBy = (AuthorizeBy)int.Parse(getDefaults.Value); goto reAuth; case AuthorizeBy.UsernameEmailPhone: result = await _dataLayer.TblIdentityCredentials .Include(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefaultAsync(i => i.UserName == request.Username, cancellationToken: cancellationToken); result ??= _dataLayer.TblIdentityContacts .Include(i => i.UserCredential) .ThenInclude(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == (long?)GenericContactType.Email)?.UserCredential; result ??= _dataLayer.TblIdentityContacts .Include(i => i.UserCredential) .ThenInclude(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == (long?)GenericContactType.Phone)?.UserCredential; break; case AuthorizeBy.Username: result = await _dataLayer.TblIdentityCredentials .Include(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefaultAsync(i => i.UserName == request.Username, cancellationToken: cancellationToken); break; case AuthorizeBy.Email: request.Username.ValidateEmailAddress(); result = _dataLayer.TblIdentityContacts .Include(i => i.UserCredential) .ThenInclude(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefault(i => i.Value == request.Username & i.UcentitiesId == 1)?.UserCredential; break; case AuthorizeBy.Phone: result = _dataLayer.TblIdentityContacts .Include(i => i.UserCredential) .ThenInclude(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefault(i => i.Value == request.Username.ValidatePhoneNumber(false) & i.UcentitiesId == 2)?.UserCredential; break; case AuthorizeBy.Token: result = await _dataLayer.TblIdentityCredentials .Include(i => i.IdentityInfo) .AsNoTracking() .FirstOrDefaultAsync(i => i.UserName == request.Username, cancellationToken: cancellationToken); break; default: throw new ArgumentOutOfRangeException(); } return(result); }
public virtual async Task <JsonResult> Authenticate([FromBody] AuthenticateCredentialQuery request) { var result = await _mediator.Send(request); return(new JsonResult(result)); }