Move credential native methods to their own file. Create a QueryNameSupport.cs file to hold a couple classes related to implementing that functionality.
This commit is contained in:
@@ -106,7 +106,6 @@ namespace NSspi.Contexts
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( status == SecurityStatus.OK )
|
if ( status == SecurityStatus.OK )
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ using System.Linq;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSspi.Contexts;
|
||||||
|
|
||||||
namespace NSspi.Contexts
|
namespace NSspi
|
||||||
{
|
{
|
||||||
public static class ContextNativeMethods
|
public static class ContextNativeMethods
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System.Runtime.CompilerServices;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSspi.Credentials;
|
||||||
|
|
||||||
namespace NSspi
|
namespace NSspi
|
||||||
{
|
{
|
||||||
@@ -78,7 +79,7 @@ namespace NSspi
|
|||||||
try { }
|
try { }
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
status = NativeMethods.AcquireCredentialsHandle(
|
status = CredentialNativeMethods.AcquireCredentialsHandle(
|
||||||
null,
|
null,
|
||||||
packageName,
|
packageName,
|
||||||
use,
|
use,
|
||||||
@@ -119,12 +120,12 @@ namespace NSspi
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
NativeMethods.QueryNameAttribCarrier carrier = new NativeMethods.QueryNameAttribCarrier();
|
QueryNameAttribCarrier carrier = new QueryNameAttribCarrier();
|
||||||
|
|
||||||
SecurityStatus status;
|
SecurityStatus status;
|
||||||
string name = null;
|
string name = null;
|
||||||
|
|
||||||
status = NativeMethods.QueryCredentialsAttribute_Name(
|
status = CredentialNativeMethods.QueryCredentialsAttribute_Name(
|
||||||
ref this.safeCredHandle.rawHandle,
|
ref this.safeCredHandle.rawHandle,
|
||||||
CredentialQueryAttrib.Names,
|
CredentialQueryAttrib.Names,
|
||||||
ref carrier
|
ref carrier
|
||||||
@@ -170,5 +171,6 @@ namespace NSspi
|
|||||||
this.disposed = true;
|
this.disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
107
Credentials/CredentialNativeMethods.cs
Normal file
107
Credentials/CredentialNativeMethods.cs
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NSspi.Credentials;
|
||||||
|
|
||||||
|
namespace NSspi
|
||||||
|
{
|
||||||
|
public static class CredentialNativeMethods
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
SECURITY_STATUS sResult = AcquireCredentialsHandle(
|
||||||
|
NULL, // [in] name of principal. NULL = principal of current security context
|
||||||
|
pszPackageName, // [in] name of package
|
||||||
|
fCredentialUse, // [in] flags indicating use.
|
||||||
|
NULL, // [in] pointer to logon identifier. NULL = we're not specifying the id of another logon session
|
||||||
|
NULL, // [in] package-specific data. NULL = default credentials for security package
|
||||||
|
NULL, // [in] pointer to GetKey function. NULL = we're not using a callback to retrieve the credentials
|
||||||
|
NULL, // [in] value to pass to GetKey
|
||||||
|
this->credentialHandle, // [out] credential handle (this must be already allocated)
|
||||||
|
&tsExpiry // [out] lifetime of the returned credentials
|
||||||
|
);
|
||||||
|
|
||||||
|
SECURITY_STATUS SEC_Entry AcquireCredentialsHandle(
|
||||||
|
_In_ SEC_CHAR *pszPrincipal,
|
||||||
|
_In_ SEC_CHAR *pszPackage,
|
||||||
|
_In_ ULONG fCredentialUse,
|
||||||
|
_In_ PLUID pvLogonID,
|
||||||
|
_In_ PVOID pAuthData,
|
||||||
|
_In_ SEC_GET_KEY_FN pGetKeyFn,
|
||||||
|
_In_ PVOID pvGetKeyArgument,
|
||||||
|
_Out_ PCredHandle phCredential,
|
||||||
|
_Out_ PTimeStamp ptsExpiry
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
[DllImport(
|
||||||
|
"Secur32.dll",
|
||||||
|
EntryPoint = "AcquireCredentialsHandle",
|
||||||
|
CallingConvention = CallingConvention.Winapi,
|
||||||
|
CharSet = CharSet.Unicode,
|
||||||
|
SetLastError = true
|
||||||
|
)]
|
||||||
|
public static extern SecurityStatus AcquireCredentialsHandle(
|
||||||
|
string principleName,
|
||||||
|
string packageName,
|
||||||
|
CredentialUse credentialUse,
|
||||||
|
IntPtr loginId,
|
||||||
|
IntPtr packageData,
|
||||||
|
IntPtr getKeyFunc,
|
||||||
|
IntPtr getKeyData,
|
||||||
|
ref RawSspiHandle credentialHandle,
|
||||||
|
ref long expiry
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
SECURITY_STATUS SEC_Entry FreeCredentialsHandle(
|
||||||
|
_In_ PCredHandle phCredential
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
[DllImport(
|
||||||
|
"Secur32.dll",
|
||||||
|
EntryPoint = "FreeCredentialsHandle",
|
||||||
|
CallingConvention = CallingConvention.Winapi,
|
||||||
|
CharSet = CharSet.Unicode,
|
||||||
|
SetLastError = true
|
||||||
|
)]
|
||||||
|
public static extern SecurityStatus FreeCredentialsHandle(
|
||||||
|
ref RawSspiHandle credentialHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
SECURITY_STATUS SEC_Entry QueryCredentialsAttributes(
|
||||||
|
_In_ PCredHandle phCredential,
|
||||||
|
_In_ ULONG ulAttribute,
|
||||||
|
_Out_ PVOID pBuffer
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The overload of the QueryCredentialsAttribute method that is used for querying the name attribute.
|
||||||
|
/// In this call, it takes a void* to a structure that contains a wide char pointer. The wide character
|
||||||
|
/// pointer is allocated by the SSPI api, and thus needs to be released by a call to FreeContextBuffer().
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="credentialHandle"></param>
|
||||||
|
/// <param name="attributeName"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DllImport(
|
||||||
|
"Secur32.dll",
|
||||||
|
EntryPoint = "QueryCredentialsAttributes",
|
||||||
|
CallingConvention = CallingConvention.Winapi,
|
||||||
|
CharSet = CharSet.Unicode,
|
||||||
|
SetLastError = true
|
||||||
|
)]
|
||||||
|
public static extern SecurityStatus QueryCredentialsAttribute_Name(
|
||||||
|
ref RawSspiHandle credentialHandle,
|
||||||
|
CredentialQueryAttrib attributeName,
|
||||||
|
ref QueryNameAttribCarrier name
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Credentials/QueryNameSupport.cs
Normal file
15
Credentials/QueryNameSupport.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NSspi.Credentials
|
||||||
|
{
|
||||||
|
[StructLayout( LayoutKind.Sequential )]
|
||||||
|
public struct QueryNameAttribCarrier
|
||||||
|
{
|
||||||
|
public IntPtr Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -56,10 +56,12 @@
|
|||||||
<Compile Include="Contexts\ServerContext.cs" />
|
<Compile Include="Contexts\ServerContext.cs" />
|
||||||
<Compile Include="Credentials\ClientCredential.cs" />
|
<Compile Include="Credentials\ClientCredential.cs" />
|
||||||
<Compile Include="Credentials\Credential.cs" />
|
<Compile Include="Credentials\Credential.cs" />
|
||||||
|
<Compile Include="Credentials\CredentialNativeMethods.cs" />
|
||||||
<Compile Include="Credentials\CredentialPackage.cs" />
|
<Compile Include="Credentials\CredentialPackage.cs" />
|
||||||
<Compile Include="Credentials\CredentialQueryAttrib.cs" />
|
<Compile Include="Credentials\CredentialQueryAttrib.cs" />
|
||||||
<Compile Include="Credentials\CredentialType.cs" />
|
<Compile Include="Credentials\CredentialType.cs" />
|
||||||
<Compile Include="Credentials\CredentialUse.cs" />
|
<Compile Include="Credentials\CredentialUse.cs" />
|
||||||
|
<Compile Include="Credentials\QueryNameSupport.cs" />
|
||||||
<Compile Include="Credentials\ServerCredential.cs" />
|
<Compile Include="Credentials\ServerCredential.cs" />
|
||||||
<Compile Include="NativeMethods.cs" />
|
<Compile Include="NativeMethods.cs" />
|
||||||
<Compile Include="PackageNames.cs" />
|
<Compile Include="PackageNames.cs" />
|
||||||
|
|||||||
@@ -17,67 +17,7 @@ namespace NSspi
|
|||||||
// A C++ pure client/server example:
|
// A C++ pure client/server example:
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=vs.85).aspx
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380536(v=vs.85).aspx
|
||||||
|
|
||||||
/*
|
|
||||||
SECURITY_STATUS sResult = AcquireCredentialsHandle(
|
|
||||||
NULL, // [in] name of principal. NULL = principal of current security context
|
|
||||||
pszPackageName, // [in] name of package
|
|
||||||
fCredentialUse, // [in] flags indicating use.
|
|
||||||
NULL, // [in] pointer to logon identifier. NULL = we're not specifying the id of another logon session
|
|
||||||
NULL, // [in] package-specific data. NULL = default credentials for security package
|
|
||||||
NULL, // [in] pointer to GetKey function. NULL = we're not using a callback to retrieve the credentials
|
|
||||||
NULL, // [in] value to pass to GetKey
|
|
||||||
this->credentialHandle, // [out] credential handle (this must be already allocated)
|
|
||||||
&tsExpiry // [out] lifetime of the returned credentials
|
|
||||||
);
|
|
||||||
|
|
||||||
SECURITY_STATUS SEC_Entry AcquireCredentialsHandle(
|
|
||||||
_In_ SEC_CHAR *pszPrincipal,
|
|
||||||
_In_ SEC_CHAR *pszPackage,
|
|
||||||
_In_ ULONG fCredentialUse,
|
|
||||||
_In_ PLUID pvLogonID,
|
|
||||||
_In_ PVOID pAuthData,
|
|
||||||
_In_ SEC_GET_KEY_FN pGetKeyFn,
|
|
||||||
_In_ PVOID pvGetKeyArgument,
|
|
||||||
_Out_ PCredHandle phCredential,
|
|
||||||
_Out_ PTimeStamp ptsExpiry
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
|
|
||||||
[DllImport(
|
|
||||||
"Secur32.dll",
|
|
||||||
EntryPoint = "AcquireCredentialsHandle",
|
|
||||||
CallingConvention = CallingConvention.Winapi,
|
|
||||||
CharSet = CharSet.Unicode,
|
|
||||||
SetLastError = true
|
|
||||||
)]
|
|
||||||
public static extern SecurityStatus AcquireCredentialsHandle(
|
|
||||||
string principleName,
|
|
||||||
string packageName,
|
|
||||||
CredentialUse credentialUse,
|
|
||||||
IntPtr loginId,
|
|
||||||
IntPtr packageData,
|
|
||||||
IntPtr getKeyFunc,
|
|
||||||
IntPtr getKeyData,
|
|
||||||
ref RawSspiHandle credentialHandle,
|
|
||||||
ref long expiry
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
|
||||||
SECURITY_STATUS SEC_Entry FreeCredentialsHandle(
|
|
||||||
_In_ PCredHandle phCredential
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
[DllImport(
|
|
||||||
"Secur32.dll",
|
|
||||||
EntryPoint = "FreeCredentialsHandle",
|
|
||||||
CallingConvention = CallingConvention.Winapi,
|
|
||||||
CharSet = CharSet.Unicode,
|
|
||||||
SetLastError = true
|
|
||||||
)]
|
|
||||||
public static extern SecurityStatus FreeCredentialsHandle(
|
|
||||||
ref RawSspiHandle credentialHandle
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SECURITY_STATUS SEC_Entry FreeContextBuffer(
|
SECURITY_STATUS SEC_Entry FreeContextBuffer(
|
||||||
_In_ PVOID pvContextBuffer
|
_In_ PVOID pvContextBuffer
|
||||||
@@ -91,43 +31,6 @@ namespace NSspi
|
|||||||
SetLastError = true
|
SetLastError = true
|
||||||
)]
|
)]
|
||||||
public static extern SecurityStatus FreeContextBuffer( IntPtr buffer );
|
public static extern SecurityStatus FreeContextBuffer( IntPtr buffer );
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
SECURITY_STATUS SEC_Entry QueryCredentialsAttributes(
|
|
||||||
_In_ PCredHandle phCredential,
|
|
||||||
_In_ ULONG ulAttribute,
|
|
||||||
_Out_ PVOID pBuffer
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The overload of the QueryCredentialsAttribute method that is used for querying the name attribute.
|
|
||||||
/// In this call, it takes a void* to a structure that contains a wide char pointer. The wide character
|
|
||||||
/// pointer is allocated by the SSPI api, and thus needs to be released by a call to FreeContextBuffer().
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="credentialHandle"></param>
|
|
||||||
/// <param name="attributeName"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[DllImport(
|
|
||||||
"Secur32.dll",
|
|
||||||
EntryPoint = "QueryCredentialsAttributes",
|
|
||||||
CallingConvention = CallingConvention.Winapi,
|
|
||||||
CharSet = CharSet.Unicode,
|
|
||||||
SetLastError = true
|
|
||||||
)]
|
|
||||||
public static extern SecurityStatus QueryCredentialsAttribute_Name(
|
|
||||||
ref RawSspiHandle credentialHandle,
|
|
||||||
CredentialQueryAttrib attributeName,
|
|
||||||
ref QueryNameAttribCarrier name
|
|
||||||
);
|
|
||||||
|
|
||||||
[StructLayout( LayoutKind.Sequential )]
|
|
||||||
public struct QueryNameAttribCarrier
|
|
||||||
{
|
|
||||||
public IntPtr Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ namespace NSspi
|
|||||||
|
|
||||||
protected override bool ReleaseHandle()
|
protected override bool ReleaseHandle()
|
||||||
{
|
{
|
||||||
SecurityStatus status = NativeMethods.FreeCredentialsHandle(
|
SecurityStatus status = CredentialNativeMethods.FreeCredentialsHandle(
|
||||||
ref base.rawHandle
|
ref base.rawHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user