Esempio n. 1
0
        /// <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);
        }