public static void Run(SecurityContext securityContext, ContextCallback callback, Object state) { if (securityContext == null) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NullContext")); } if (!securityContext.isNewCapture) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotNewCaptureContext")); } securityContext.isNewCapture = false; ExecutionContext ec = Thread.CurrentThread.GetExecutionContextNoCreate(); if (SecurityContext.CurrentlyInDefaultFTSecurityContext(ec) && securityContext.IsDefaultFTSecurityContext()) { callback(state); } else { RunInternal(securityContext, callback, state); } }
public static void Run(SecurityContext securityContext, ContextCallback callback, object state) { if (securityContext == null) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NullContext")); } StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMe; if (!securityContext.isNewCapture) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotNewCaptureContext")); } securityContext.isNewCapture = false; ExecutionContext.Reader executionContextReader = Thread.CurrentThread.GetExecutionContextReader(); if (SecurityContext.CurrentlyInDefaultFTSecurityContext(executionContextReader) && securityContext.IsDefaultFTSecurityContext()) { callback(state); if (SecurityContext.GetCurrentWI(Thread.CurrentThread.GetExecutionContextReader()) != null) { WindowsIdentity.SafeRevertToSelf(ref stackCrawlMark); return; } } else { SecurityContext.RunInternal(securityContext, callback, state); } }
internal static SecurityContext Capture(ExecutionContext.Reader currThreadEC, ref StackCrawlMark stackMark) { if (currThreadEC.SecurityContext.IsFlowSuppressed(SecurityContextDisableFlow.All)) { return(null); } if (SecurityContext.CurrentlyInDefaultFTSecurityContext(currThreadEC)) { return(null); } return(SecurityContext.CaptureCore(currThreadEC, ref stackMark)); }
[MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var has to be marked non-inlineable public static void Run(SecurityContext securityContext, ContextCallback callback, Object state) { if (securityContext == null) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NullContext")); } Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMe; if (!securityContext.isNewCapture) { throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_NotNewCaptureContext")); } securityContext.isNewCapture = false; #if !MOBILE ExecutionContext.Reader ec = Thread.CurrentThread.GetExecutionContextReader(); // Optimization: do the callback directly if both the current and target contexts are equal to the // default full-trust security context if (SecurityContext.CurrentlyInDefaultFTSecurityContext(ec) && securityContext.IsDefaultFTSecurityContext()) { callback(state); if (GetCurrentWI(Thread.CurrentThread.GetExecutionContextReader()) != null) { // If we enter here it means the callback did an impersonation // that we need to revert. // We don't need to revert any other security state since it is stack-based // and automatically goes away when the callback returns. WindowsIdentity.SafeRevertToSelf(ref stackMark); // Ensure we have reverted to the state we entered in. Contract.Assert(GetCurrentWI(Thread.CurrentThread.GetExecutionContextReader()) == null); } } else #endif { RunInternal(securityContext, callback, state); } }