e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
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; }
|
|
}
|
|
}
|
|
}
|