Split the Credential init code off into each concrete credential.

This commit is contained in:
antiduh
2014-06-30 15:32:31 +00:00
parent 372460a78f
commit 5da12ad4c4
3 changed files with 141 additions and 78 deletions

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
@@ -8,6 +9,73 @@ namespace NSspi.Credentials
{
public class ClientCredential : Credential
{
public ClientCredential( SecurityPackage package ) : base( package, CredentialType.Client ) { }
public ClientCredential( SecurityPackage package )
: base( package )
{
Init();
}
private void Init( )
{
string packageName;
CredentialUse use;
TimeStamp rawExpiry = new TimeStamp();
// -- Package --
if( this.SecurityPackage == SecurityPackage.Kerberos )
{
packageName = PackageNames.Kerberos;
}
else if( this.SecurityPackage == SecurityPackage.Negotiate )
{
packageName = PackageNames.Negotiate;
}
else if( this.SecurityPackage == SecurityPackage.NTLM )
{
packageName = PackageNames.Ntlm;
}
else
{
throw new ArgumentException( "Invalid value provided for the 'package' parameter." );
}
// -- Credential --
// Client uses outbound credentials.
use = CredentialUse.Outbound;
// -- Invoke --
SecurityStatus status = SecurityStatus.InternalError;
this.Handle = new SafeCredentialHandle();
// The finally clause is the actual constrained region. The VM pre-allocates any stack space,
// performs any allocations it needs to prepare methods for execution, and postpones any
// instances of the 'uncatchable' exceptions (ThreadAbort, StackOverflow, OutOfMemory).
RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
status = CredentialNativeMethods.AcquireCredentialsHandle(
null,
packageName,
use,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
ref this.Handle.rawHandle,
ref rawExpiry
);
}
if( status != SecurityStatus.OK )
{
throw new SSPIException( "Failed to call AcquireCredentialHandle", status );
}
this.Expiry = rawExpiry.ToDateTime();
}
}
}

View File

@@ -22,88 +22,14 @@ namespace NSspi.Credentials
private DateTime expiry;
public Credential(SecurityPackage package, CredentialType credentialType)
public Credential( SecurityPackage package )
{
this.disposed = false;
this.securityPackage = package;
this.expiry = DateTime.MinValue;
Init( package, credentialType );
}
private void Init( SecurityPackage package, CredentialType credentialType )
{
string packageName;
CredentialUse use;
TimeStamp rawExpiry = new TimeStamp();
// -- Package --
if ( package == SecurityPackage.Kerberos )
{
packageName = PackageNames.Kerberos;
}
else if ( package == SecurityPackage.Negotiate )
{
packageName = PackageNames.Negotiate;
}
else if ( package == SecurityPackage.NTLM )
{
packageName = PackageNames.Ntlm;
}
else
{
throw new ArgumentException( "Invalid value provided for the 'package' parameter." );
}
// -- Credential --
if ( credentialType == CredentialType.Client )
{
use = CredentialUse.Outbound;
}
else if ( credentialType == CredentialType.Server )
{
use = CredentialUse.Inbound;
}
else
{
throw new ArgumentException( "Invalid value provided for the 'credentialType' parameter." );
}
// -- Invoke --
SecurityStatus status = SecurityStatus.InternalError;
this.safeCredHandle = new SafeCredentialHandle();
// The finally clause is the actual constrained region. The VM pre-allocates any stack space,
// performs any allocations it needs to prepare methods for execution, and postpones any
// instances of the 'uncatchable' exceptions (ThreadAbort, StackOverflow, OutOfMemory).
RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
status = CredentialNativeMethods.AcquireCredentialsHandle(
null,
packageName,
use,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
ref this.safeCredHandle.rawHandle,
ref rawExpiry
);
}
if ( status != SecurityStatus.OK )
{
throw new SSPIException( "Failed to call AcquireCredentialHandle", status );
}
this.expiry = rawExpiry.ToDateTime();
}
~Credential()
{
Dispose( false );
@@ -199,6 +125,7 @@ namespace NSspi.Credentials
return this.expiry;
}
protected set
{
if( this.disposed )

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
@@ -8,6 +9,73 @@ namespace NSspi.Credentials
{
public class ServerCredential : Credential
{
public ServerCredential( SecurityPackage package ) : base( package, CredentialType.Server ) { }
public ServerCredential( SecurityPackage package )
: base( package )
{
Init();
}
private void Init()
{
string packageName;
CredentialUse use;
TimeStamp rawExpiry = new TimeStamp();
// -- Package --
if( this.SecurityPackage == SecurityPackage.Kerberos )
{
packageName = PackageNames.Kerberos;
}
else if( this.SecurityPackage == SecurityPackage.Negotiate )
{
packageName = PackageNames.Negotiate;
}
else if( this.SecurityPackage == SecurityPackage.NTLM )
{
packageName = PackageNames.Ntlm;
}
else
{
throw new ArgumentException( "Invalid value provided for the 'package' parameter." );
}
// -- Credential --
// Server uses Inbound credentials.
use = CredentialUse.Inbound;
// -- Invoke --
SecurityStatus status = SecurityStatus.InternalError;
this.Handle = new SafeCredentialHandle();
// The finally clause is the actual constrained region. The VM pre-allocates any stack space,
// performs any allocations it needs to prepare methods for execution, and postpones any
// instances of the 'uncatchable' exceptions (ThreadAbort, StackOverflow, OutOfMemory).
RuntimeHelpers.PrepareConstrainedRegions();
try { }
finally
{
status = CredentialNativeMethods.AcquireCredentialsHandle(
null,
packageName,
use,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
ref this.Handle.rawHandle,
ref rawExpiry
);
}
if( status != SecurityStatus.OK )
{
throw new SSPIException( "Failed to call AcquireCredentialHandle", status );
}
this.Expiry = rawExpiry.ToDateTime();
}
}
}