public bool TryAcquireServerChallenge(WindowsAuthenticationToken message)
        {
            bool result = false;

            SecurityBufferDesciption clientToken = new SecurityBufferDesciption(message.Data);
            SecurityBufferDesciption serverToken = new SecurityBufferDesciption(MaximumTokenSize);

            try
            {
                SecurityInteger lifetime = new SecurityInteger(0);
                uint contextAttributes;

                if (NativeMethods.AcquireCredentialsHandle(null, "NTLM", SecurityCredentialsInbound, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, ref credentials, ref lifetime) == 0)
                {
                    if (NativeMethods.AcceptSecurityContext(ref credentials, IntPtr.Zero, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out contextAttributes, out lifetime) == IntermediateResult)
                    {
                        result = true;
                    }
                }
            }
            finally
            {
                message.Data = serverToken.GetBytes();
                clientToken.Dispose();
                serverToken.Dispose();
            }

            return result;
        }
        public bool IsClientResponseValid(WindowsAuthenticationToken token)
        {
            bool result = false;

            SecurityBufferDesciption clientToken = new SecurityBufferDesciption(token.Data);
            SecurityBufferDesciption serverToken = new SecurityBufferDesciption(MaximumTokenSize);
            IntPtr securityContextHandle = IntPtr.Zero;

            try
            {
                uint contextAttributes;
                var lifetime = new SecurityInteger(0);

                if (NativeMethods.AcceptSecurityContext(ref credentials, ref context, ref clientToken, StandardContextAttributes, SecurityNativeDataRepresentation, out context, out serverToken, out contextAttributes, out lifetime) == 0)
                {
                    if (NativeMethods.QuerySecurityContextToken(ref context, ref securityContextHandle) == 0)
                    {
                        using (WindowsIdentity identity = new WindowsIdentity(securityContextHandle))
                        { 
                            if (identity != null)
                            {
                                AuthenticatedUsername = identity.Name;
                                result = true;
                            }
                        }
                    }
                }
            }
            finally
            {
                clientToken.Dispose();
                serverToken.Dispose();
                NativeMethods.CloseHandle(securityContextHandle);
                credentials.Reset();
                context.Reset();
            }

            return result;
        }
 public static extern int AcceptSecurityContext(ref SecurityHandle phCredential,
     ref SecurityHandle phContext,
     ref SecurityBufferDesciption pInput,
     uint fContextReq,
     uint TargetDataRep,
     out SecurityHandle phNewContext,
     out SecurityBufferDesciption pOutput,
     out uint pfContextAttr,
     out SecurityInteger ptsTimeStamp
     );
 public static extern int AcquireCredentialsHandle(
     string pszPrincipal,
     string pszPackage,
     int fCredentialUse,
     IntPtr PAuthenticationID,
     IntPtr pAuthData,
     int pGetKeyFn,
     IntPtr pvGetKeyArgument,
     ref SecurityHandle phCredential,
     ref SecurityInteger ptsExpiry);