public async Task <LogonResponse> Logon(LogonRequestData logonRequestData)
        {
            if (!string.IsNullOrEmpty(await _sessionBag.AgentName()))
            {
                throw new ResponseErrorException(ResponseErrorCode.AlreadyLoggedIn,
                                                 string.Format("Already logged in as {0}", await _sessionBag.AgentName()));
            }
            nsk.LogonResponse logonResponse;
            var previousSignature = await _sessionBag.Signature();

            try
            {
                logonResponse = await _client.LogonAsync(new nsk.LogonRequest
                {
                    logonRequestData = _mapper.Map <nsk.LogonRequestData>(logonRequestData)
                });
            }
            catch (System.ServiceModel.FaultException e)
            {
                if (e.Message.Contains("No agent found") || e.Message.Contains("was not authenticated") || e.Message.StartsWith("Unable to find best role for agent"))
                {
                    throw new ResponseErrorException(ResponseErrorCode.InvalidLogin, "Invalid login details. ");
                }

                //Handle scenario: System.ServiceModel.FaultException: 'The agent (WW2/[email protected]) must reset their password.'
                if (e.Message.Contains("must reset their password"))
                {
                    return(new LogonResponse {
                        MustChangePassword = true
                    });
                }

                throw e;
            }
            var newSignature = logonResponse.Signature;
            var booking      = await _sessionBag.Booking();

            if (booking != null && string.IsNullOrEmpty(booking.RecordLocator) && !string.IsNullOrEmpty(previousSignature))
            {
                var result = await _client.TransferSessionAsync(new nsk.TransferSessionRequest
                {
                    ContractVersion = _newskiesSettings.ApiContractVersion,
                    tokenRequest    = new nsk.TokenRequest
                    {
                        Token       = previousSignature,
                        ChannelType = nsk.ChannelType.API,
                        SystemType  = nsk.SystemType.WebServicesAPI
                    }
                });

                newSignature = result.TransferSessionResponseData.Signature;
            }
            await _sessionBag.SetSignature(newSignature);

            //await _sessionBag.SetSignature(logonResponse.Signature);
            await _sessionBag.SetAgentName(logonRequestData.AgentName);

            await _sessionBag.SetAgentPassword(logonRequestData.Password);

            var agentInfo = await GetAgentInfo(logonRequestData.AgentName, logonRequestData.DomainCode);

            await _sessionBag.SetRoleCode(agentInfo.Item1);

            await _sessionBag.SetOrganizationCode(agentInfo.Item2);

            await _sessionBag.SetAgentId(agentInfo.Item3);

            await _sessionBag.SetPersonId(agentInfo.Item4);

            await _sessionBag.SetCustomerNumber(agentInfo.Item5);

            return(_mapper.Map <LogonResponse>(logonResponse));
        }