コード例 #1
0
        private static bool GssInitSecurityContext(
            ref SafeGssContextHandle context,
            SafeGssCredHandle credential,
            bool isNtlm,
            SecurityBuffer cbt,
            SafeGssNameHandle targetName,
            Interop.NetSecurityNative.GssFlags inFlags,
            byte[] buffer,
            out byte[] outputBuffer,
            out uint outFlags,
            out int isNtlmUsed)
        {
            // If a TLS channel binding token (cbt) is available then get the pointer
            // to the application specific data.
            IntPtr cbtAppData     = IntPtr.Zero;
            int    cbtAppDataSize = 0;

            if (cbt != null)
            {
                int appDataOffset = Marshal.SizeOf <SecChannelBindings>();
                Debug.Assert(appDataOffset < cbt.size);
                cbtAppData     = cbt.unmanagedToken.DangerousGetHandle() + appDataOffset;
                cbtAppDataSize = cbt.size - appDataOffset;
            }

            outputBuffer = null;
            outFlags     = 0;

            // EstablishSecurityContext is called multiple times in a session.
            // In each call, we need to pass the context handle from the previous call.
            // For the first call, the context handle will be null.
            if (context == null)
            {
                context = new SafeGssContextHandle();
            }

            Interop.NetSecurityNative.GssBuffer token = default(Interop.NetSecurityNative.GssBuffer);
            Interop.NetSecurityNative.Status    status;

            try
            {
                Interop.NetSecurityNative.Status minorStatus;
                status = Interop.NetSecurityNative.InitSecContext(out minorStatus,
                                                                  credential,
                                                                  ref context,
                                                                  isNtlm,
                                                                  cbtAppData,
                                                                  cbtAppDataSize,
                                                                  targetName,
                                                                  (uint)inFlags,
                                                                  buffer,
                                                                  (buffer == null) ? 0 : buffer.Length,
                                                                  ref token,
                                                                  out outFlags,
                                                                  out isNtlmUsed);

                if ((status != Interop.NetSecurityNative.Status.GSS_S_COMPLETE) && (status != Interop.NetSecurityNative.Status.GSS_S_CONTINUE_NEEDED))
                {
                    throw new Interop.NetSecurityNative.GssApiException(status, minorStatus);
                }

                outputBuffer = token.ToByteArray();
            }
            finally
            {
                token.Dispose();
            }

            return(status == Interop.NetSecurityNative.Status.GSS_S_COMPLETE);
        }