/// <summary> /// Handler for pre-login request /// </summary> public virtual TDSMessageCollection OnPreLoginRequest(ITDSServerSession session, TDSMessage request) { // Inflate pre-login request from the message TDSPreLoginToken preLoginRequest = request[0] as TDSPreLoginToken; // Log request TDSUtilities.Log(Arguments.Log, "Request", preLoginRequest); // Generate server response for encryption TDSPreLoginTokenEncryptionType serverResponse = TDSUtilities.GetEncryptionResponse(preLoginRequest.Encryption, Arguments.Encryption); // Update client state with encryption resolution session.Encryption = TDSUtilities.ResolveEncryption(preLoginRequest.Encryption, serverResponse); // Create TDS prelogin packet TDSPreLoginToken preLoginToken = new TDSPreLoginToken(Arguments.ServerVersion, serverResponse, false); // TDS server doesn't support MARS // Cache the recieved Nonce into the session (session as GenericTDSServerSession).ClientNonce = preLoginRequest.Nonce; // Check if the server has been started up as requiring FedAuth when choosing between SSPI and FedAuth if (Arguments.FedAuthRequiredPreLoginOption == TdsPreLoginFedAuthRequiredOption.FedAuthRequired) { if (preLoginRequest.FedAuthRequired == TdsPreLoginFedAuthRequiredOption.FedAuthRequired) { // Set the FedAuthRequired option preLoginToken.FedAuthRequired = TdsPreLoginFedAuthRequiredOption.FedAuthRequired; } // Keep the federated authentication required flag in the server session (session as GenericTDSServerSession).FedAuthRequiredPreLoginServerResponse = preLoginToken.FedAuthRequired; if (preLoginRequest.Nonce != null) { // Generate Server Nonce preLoginToken.Nonce = _GenerateRandomBytes(32); } } // Cache the server Nonce in a session (session as GenericTDSServerSession).ServerNonce = preLoginToken.Nonce; // Log response TDSUtilities.Log(Arguments.Log, "Response", preLoginToken); // Reset authentication information session.SQLUserID = null; session.NTUserAuthenticationContext = null; // Respond with a single message that contains only one token return(new TDSMessageCollection(new TDSMessage(TDSMessageType.Response, preLoginToken))); }