/// <summary> /// initialize the negotiate flags /// </summary> /// <returns>the negotiate flags for authenticate</returns> private NegotiateTypes InitializeNegotiateFlags(NegotiateTypes challengeFlags) { NegotiateTypes flags = this.Context.ClientConfigFlags; flags |= NegotiateTypes.NTLMSSP_NEGOTIATE_TARGET_INFO; // A==1: The choice of character set encoding MUST be Unicode. // A==0 and B==1: The choice of character set encoding MUST be OEM. // A==0 and B==0: The protocol MUST return SEC_E_INVALID_TOKEN. if (NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE == (challengeFlags & NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE)) { if (flags.HasFlag(NegotiateTypes.NTLM_NEGOTIATE_OEM)) { flags ^= NegotiateTypes.NTLM_NEGOTIATE_OEM; } if (!flags.HasFlag(NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE)) { flags |= NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE; } } else if (NegotiateTypes.NTLM_NEGOTIATE_OEM == (challengeFlags & NegotiateTypes.NTLM_NEGOTIATE_OEM)) { if (flags.HasFlag(NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE)) { flags ^= NegotiateTypes.NTLMSSP_NEGOTIATE_UNICODE; } if (!flags.HasFlag(NegotiateTypes.NTLM_NEGOTIATE_OEM)) { flags |= NegotiateTypes.NTLM_NEGOTIATE_OEM; } } else { throw new Exception("The protocol MUST return SEC_E_INVALID_TOKEN"); } return(flags); }