GSS improvements, set context to null after a successfull call to DeleteSecurityContext

This commit is contained in:
Tal Aloni 2017-03-04 14:59:28 +02:00
parent 900ff25a3c
commit d742a22756
5 changed files with 24 additions and 10 deletions

View file

@ -112,18 +112,24 @@ namespace SMBLibrary.Authentication.GSSAPI
return mechanism.GetContextAttribute(context, attributeName);
}
public void DeleteSecurityContext(ref object context)
public bool DeleteSecurityContext(ref object context)
{
bool result = false;
if (context != null)
{
IGSSMechanism mechanism;
if (m_contextToMechanism.TryGetValue(context, out mechanism))
{
mechanism.DeleteSecurityContext(ref context);
m_contextToMechanism.Remove(context);
object contextReference = context;
result = mechanism.DeleteSecurityContext(ref context);
if (result)
{
m_contextToMechanism.Remove(contextReference);
}
}
}
return result;
}
/// <summary>
/// Helper method for legacy implementation.

View file

@ -18,12 +18,12 @@ namespace SMBLibrary.Authentication.GSSAPI
/// <summary>
/// Equivalent to GSS_Delete_sec_context
/// Obtains information about a given security context (even an incomplete one)
/// </summary>
void DeleteSecurityContext(ref object context);
bool DeleteSecurityContext(ref object context);
/// <summary>
/// Equivalent to GSS_Inquire_context
/// Obtains information about a given security context (even an incomplete one)
/// </summary>
object GetContextAttribute(object context, GSSAttributeName attributeName);

View file

@ -223,8 +223,10 @@ namespace SMBLibrary.Authentication.NTLM
}
}
public override void DeleteSecurityContext(ref object context)
public override bool DeleteSecurityContext(ref object context)
{
context = null;
return true;
}
public override object GetContextAttribute(object context, GSSAttributeName attributeName)

View file

@ -46,7 +46,7 @@ namespace SMBLibrary.Authentication.NTLM
public abstract NTStatus Authenticate(object context, AuthenticateMessage authenticateMessage);
public abstract void DeleteSecurityContext(ref object context);
public abstract bool DeleteSecurityContext(ref object context);
public abstract object GetContextAttribute(object context, GSSAttributeName attributeName);

View file

@ -125,16 +125,22 @@ namespace SMBLibrary.Win32.Security
}
}
public override void DeleteSecurityContext(ref object context)
public override bool DeleteSecurityContext(ref object context)
{
AuthContext authContext = context as AuthContext;
if (authContext == null)
{
return;
return false;
}
SecHandle handle = ((AuthContext)context).ServerContext;
SSPIHelper.DeleteSecurityContext(ref handle);
uint result = SSPIHelper.DeleteSecurityContext(ref handle);
bool success = (result == 0); // SEC_E_OK
if (success)
{
context = null;
}
return success;
}
public override object GetContextAttribute(object context, GSSAttributeName attributeName)