96 lines
3.0 KiB
C#
96 lines
3.0 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="ADConnectionHelper.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.Web.DataAccess
|
||
|
{
|
||
|
using System.Net;
|
||
|
using System.Diagnostics;
|
||
|
using System.Web.Hosting;
|
||
|
using System.Web.Security;
|
||
|
using System.DirectoryServices;
|
||
|
using System.DirectoryServices.Protocols;
|
||
|
|
||
|
internal static class ActiveDirectoryConnectionHelper
|
||
|
{
|
||
|
|
||
|
internal static DirectoryEntryHolder GetDirectoryEntry(DirectoryInformation directoryInfo, string objectDN, bool revertImpersonation)
|
||
|
{
|
||
|
Debug.Assert ((objectDN != null) && (objectDN.Length != 0));
|
||
|
|
||
|
//
|
||
|
// Get the adspath and create a directory entry holder
|
||
|
//
|
||
|
DirectoryEntryHolder holder = new DirectoryEntryHolder(new DirectoryEntry (
|
||
|
directoryInfo.GetADsPath(objectDN),
|
||
|
directoryInfo.GetUsername(),
|
||
|
directoryInfo.GetPassword(),
|
||
|
directoryInfo.AuthenticationTypes));
|
||
|
//
|
||
|
// If revertImpersonation is true, we need to revert
|
||
|
//
|
||
|
holder.Open(null, revertImpersonation);
|
||
|
return holder;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal sealed class DirectoryEntryHolder
|
||
|
{
|
||
|
private ImpersonationContext ctx = null;
|
||
|
private bool opened;
|
||
|
private DirectoryEntry entry;
|
||
|
|
||
|
internal DirectoryEntryHolder (DirectoryEntry entry)
|
||
|
{
|
||
|
Debug.Assert (entry != null);
|
||
|
this.entry = entry;
|
||
|
}
|
||
|
|
||
|
internal void Open (HttpContext context, bool revertImpersonate)
|
||
|
{
|
||
|
if (opened)
|
||
|
return; // Already opened
|
||
|
|
||
|
//
|
||
|
// Revert client impersonation if required
|
||
|
//
|
||
|
if (revertImpersonate)
|
||
|
{
|
||
|
ctx = new ApplicationImpersonationContext();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ctx = null;
|
||
|
}
|
||
|
|
||
|
opened = true; // Open worked!
|
||
|
}
|
||
|
|
||
|
internal void Close ()
|
||
|
{
|
||
|
if (!opened) // Not open!
|
||
|
return;
|
||
|
|
||
|
entry.Dispose();
|
||
|
RestoreImpersonation();
|
||
|
opened = false;
|
||
|
}
|
||
|
|
||
|
internal void RestoreImpersonation() {
|
||
|
// Restore impersonation
|
||
|
if (ctx != null)
|
||
|
{
|
||
|
ctx.Undo();
|
||
|
ctx = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal DirectoryEntry DirectoryEntry
|
||
|
{
|
||
|
get { return entry; }
|
||
|
}
|
||
|
}
|
||
|
}
|