Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Activation / HostedImpersonationContext.cs / 1 / HostedImpersonationContext.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.ServiceModel.Activation
{
using System.ServiceModel;
using System.ServiceModel.Diagnostics;
using System.Security.Principal;
using System.ServiceModel.ComIntegration;
using System.ServiceModel.Security;
using System.Web.Hosting;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;
using System.Security;
using SafeCloseHandle = System.IdentityModel.SafeCloseHandleCritical;
using SMD = System.ServiceModel.Diagnostics;
///
/// RequiresReview - All member methods are security critical. The class might be used outside of the restricted SecurityContext.
/// Ensure they do not accidentally satisfy any demands
///
[SecurityRequiresReview]
class HostedImpersonationContext
{
///
/// Critical - stores the impersonation token handle. since we're allowing "safe" Impersonation of the token we got from asp.net
/// we need to protect this value
///
[SecurityCritical]
SafeCloseHandle tokenHandle;
///
/// Critical - controls lifetime of token handle, caller must use care
///
[SecurityCritical]
int refCount = 0;
///
/// Critical - a security critical field, caller must use care
///
[SecurityCritical]
bool isImpersonated;
///
/// Critical - calls two safe native methods: GetCurrentThread and OpenCurrentThreadToken; and Marshal.GetLastWin32Error
/// captures current thread token in a SecurityCritical field
///
[SecurityCritical]
public HostedImpersonationContext()
{
if (ServiceHostingEnvironment.AspNetCompatibilityEnabled)
{
bool isSuccess = SafeNativeMethods.OpenCurrentThreadTokenCritical(SafeNativeMethods.GetCurrentThread(),
TokenAccessLevels.Query | TokenAccessLevels.Impersonate, true,
out tokenHandle);
int error = Marshal.GetLastWin32Error();
if (isSuccess)
{
isImpersonated = true;
Interlocked.Increment(ref refCount);
}
else
{
SMD.Utility.CloseInvalidOutSafeHandleCritical(tokenHandle);
tokenHandle = null;
if (error != (int)Win32Error.ERROR_NO_TOKEN)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new Win32Exception(error, SR.GetString(SR.Hosting_ImpersonationFailed)));
}
}
}
}
public bool IsImpersonated
{
///
/// Critical - accesses SecurityCritical isImpersonated field
/// Safe - does not leak control or mutable/harmful data, no potential for harm
///
[SecurityCritical, SecurityTreatAsSafe]
get
{
return isImpersonated;
}
}
///
/// Critical - accesses SecurityCritical tokenHandle field and uses LinkDemanded DangerousGetHandle method as well as UnsafeCreate
/// caller should use with care, must take responsibility for reverting impersonation
///
[SecurityCritical]
public IDisposable Impersonate()
{
if (!isImpersonated)
return null;
DiagnosticUtility.DebugAssert(tokenHandle != null, "The token handle was incorrectly released earlier.");
HostedInnerImpersonationContext context = null;
lock(tokenHandle)
{
context = HostedInnerImpersonationContext.UnsafeCreate(tokenHandle.DangerousGetHandle());
GC.KeepAlive(tokenHandle);
}
return context;
}
///
/// Critical - controls lifetime of token handle, caller must use care
///
[SecurityCritical]
public void AddRef()
{
if (IsImpersonated)
{
Interlocked.Increment(ref refCount);
}
}
///
/// Critical - controls lifetime of token handle, caller must use care
///
[SecurityCritical]
public void Release()
{
if (IsImpersonated)
{
DiagnosticUtility.DebugAssert(tokenHandle != null, "The token handle is incorrectly released earlier.");
int currentCount = Interlocked.Decrement(ref refCount);
if (currentCount == 0)
{
lock(tokenHandle)
{
tokenHandle.Close();
tokenHandle = null;
}
}
}
}
///
/// Critical - keeps track of impersonated user, caller must use with care and call Dispose at the appropriate time
///
[SecurityCritical(SecurityCriticalScope.Everything)]
class HostedInnerImpersonationContext : IDisposable
{
IDisposable impersonatedContext;
HostedInnerImpersonationContext(IDisposable impersonatedContext)
{
if (impersonatedContext == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(
SR.GetString(SR.Hosting_ImpersonationFailed)));
}
this.impersonatedContext = impersonatedContext;
}
public static HostedInnerImpersonationContext UnsafeCreate(IntPtr token)
{
return new HostedInnerImpersonationContext(HostingEnvironmentWrapper.UnsafeImpersonate(token));
}
public void Dispose()
{
if (impersonatedContext != null)
{
impersonatedContext.Dispose();
impersonatedContext = null;
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BaseCodeDomTreeGenerator.cs
- UnsafeNativeMethods.cs
- AutomationPropertyInfo.cs
- IPEndPoint.cs
- FrameworkElement.cs
- IisTraceWebEventProvider.cs
- Options.cs
- XmlSchemaInclude.cs
- CompiledQuery.cs
- FilteredAttributeCollection.cs
- Timeline.cs
- TagMapInfo.cs
- HandlerWithFactory.cs
- _UriSyntax.cs
- DESCryptoServiceProvider.cs
- ErrorStyle.cs
- ConstructorBuilder.cs
- ManipulationDelta.cs
- EpmAttributeNameBuilder.cs
- PersonalizationState.cs
- StoryFragments.cs
- GeneratedView.cs
- DrawingAttributes.cs
- IdentityManager.cs
- MessageSecurityException.cs
- ApplicationBuildProvider.cs
- DataGridViewTextBoxCell.cs
- StreamMarshaler.cs
- Helper.cs
- Axis.cs
- sqlmetadatafactory.cs
- XmlUtil.cs
- httpserverutility.cs
- _UriSyntax.cs
- SplineQuaternionKeyFrame.cs
- ServiceMetadataPublishingElement.cs
- OperationAbortedException.cs
- TemplateControl.cs
- TypeSystem.cs
- SystemFonts.cs
- ApplicationSecurityInfo.cs
- HandlerWithFactory.cs
- WindowsIdentity.cs
- XmlSchemaExternal.cs
- Point3DCollection.cs
- MimePart.cs
- InfoCardBaseException.cs
- XsltContext.cs
- EditBehavior.cs
- InkSerializer.cs
- ResourcePool.cs
- CodeAttachEventStatement.cs
- ActivatableWorkflowsQueryResult.cs
- JournalEntryListConverter.cs
- SoapExtensionTypeElement.cs
- AccessKeyManager.cs
- CriticalFinalizerObject.cs
- AssertSection.cs
- BinaryReader.cs
- DetailsViewInsertedEventArgs.cs
- WorkerProcess.cs
- ContextMenuAutomationPeer.cs
- ListViewEditEventArgs.cs
- NativeMethodsOther.cs
- SymbolPair.cs
- FontWeight.cs
- WebBrowsableAttribute.cs
- StatusStrip.cs
- RegistryPermission.cs
- TableCell.cs
- Hash.cs
- AsymmetricAlgorithm.cs
- MouseGestureConverter.cs
- Rotation3DAnimationUsingKeyFrames.cs
- HandlerFactoryWrapper.cs
- FrameAutomationPeer.cs
- ConnectionStringSettings.cs
- TextEditorSelection.cs
- XmlParserContext.cs
- Encoding.cs
- EmptyEnumerator.cs
- ValueTable.cs
- SqlGenericUtil.cs
- sqlinternaltransaction.cs
- ModuleConfigurationInfo.cs
- WindowsListViewSubItem.cs
- Control.cs
- TableLayoutSettings.cs
- ImageListDesigner.cs
- DataGridCellItemAutomationPeer.cs
- DBSqlParserColumnCollection.cs
- ChannelPoolSettings.cs
- CustomCredentialPolicy.cs
- DataGridViewLayoutData.cs
- PseudoWebRequest.cs
- URLIdentityPermission.cs
- EntitySqlQueryCacheEntry.cs
- SizeChangedEventArgs.cs
- WebResourceUtil.cs
- BrowserCapabilitiesFactoryBase.cs