diff --git a/NSspi/Contexts/ClientContext.cs b/NSspi/Contexts/ClientContext.cs index 7bb4f05..6ab7b7b 100644 --- a/NSspi/Contexts/ClientContext.cs +++ b/NSspi/Contexts/ClientContext.cs @@ -149,27 +149,33 @@ ref rawExpiry ); } } - } - if( status.IsError() == false ) - { - if( status == SecurityStatus.OK ) + if (status.IsError() == false) { - base.Initialize( rawExpiry.ToDateTime() ); - } + if (status == SecurityStatus.OK) + { + base.Initialize(rawExpiry.ToDateTime()); + } + + outToken = null; - outToken = null; + if (outTokenBuffer.Length != 0) + { + outToken = new byte[outTokenBuffer.Length]; + Array.Copy(outTokenBuffer.Buffer, outToken, outToken.Length); + } - if( outTokenBuffer.Length != 0 ) + if (status == SecurityStatus.CompleteNeeded || status == SecurityStatus.CompAndContinue) + { + ContextNativeMethods.CompleteAuthToken(ref this.ContextHandle.rawHandle, outAdapter.Handle); + status = (status == SecurityStatus.CompleteNeeded) ? SecurityStatus.OK : SecurityStatus.ContinueNeeded; + } + } + else { - outToken = new byte[outTokenBuffer.Length]; - Array.Copy( outTokenBuffer.Buffer, outToken, outToken.Length ); + throw new SSPIException("Failed to invoke InitializeSecurityContext for a client", status); } } - else - { - throw new SSPIException( "Failed to invoke InitializeSecurityContext for a client", status ); - } return status; } diff --git a/NSspi/Contexts/ContextNativeMethods.cs b/NSspi/Contexts/ContextNativeMethods.cs index 1d090d2..9b96a70 100644 --- a/NSspi/Contexts/ContextNativeMethods.cs +++ b/NSspi/Contexts/ContextNativeMethods.cs @@ -102,6 +102,10 @@ ref TimeStamp expiry [DllImport( "Secur32.dll", EntryPoint = "DeleteSecurityContext", CharSet = CharSet.Unicode )] internal static extern SecurityStatus DeleteSecurityContext( ref RawSspiHandle contextHandle ); + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + [DllImport("Secur32.dll", EntryPoint = "CompleteAuthToken", CharSet = CharSet.Unicode)] + internal static extern SecurityStatus CompleteAuthToken(ref RawSspiHandle contextHandle, IntPtr buffer); + [ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )] [DllImport( "Secur32.dll", EntryPoint = "EncryptMessage", CharSet = CharSet.Unicode )] internal static extern SecurityStatus EncryptMessage(