Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / UpnEndpointIdentity.cs / 1 / UpnEndpointIdentity.cs
//---------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel { using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; using System.IdentityModel.Claims; using System.IdentityModel.Policy; using System.Security.Cryptography; using System.Security.Principal; using System.ServiceModel.Diagnostics; using System.ServiceModel.ComIntegration; using System.Text; using System.Xml; using System.Xml.Serialization; public class UpnEndpointIdentity : EndpointIdentity { SecurityIdentifier upnSid; bool hasUpnSidBeenComputed; WindowsIdentity windowsIdentity; Object thisLock = new Object(); public UpnEndpointIdentity(string upnName) { if (upnName == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("upnName"); base.Initialize(Claim.CreateUpnClaim(upnName)); this.hasUpnSidBeenComputed = false; } public UpnEndpointIdentity(Claim identity) { if (identity == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("identity"); // PreSharp Bug: Parameter 'identity.ResourceType' to this public method must be validated: A null-dereference can occur here. #pragma warning suppress 56506 // Claim.ResourceType will never return null if (!identity.ClaimType.Equals(ClaimTypes.Upn)) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.UnrecognizedClaimTypeForIdentity, identity.ClaimType, ClaimTypes.Upn)); base.Initialize(identity); } internal UpnEndpointIdentity(WindowsIdentity windowsIdentity) { if (windowsIdentity == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("windowsIdentity"); this.windowsIdentity = windowsIdentity; this.upnSid = windowsIdentity.User; this.hasUpnSidBeenComputed = true; } internal override void EnsureIdentityClaim() { if (this.windowsIdentity != null) { lock (thisLock) { if (this.windowsIdentity != null) { base.Initialize(Claim.CreateUpnClaim(GetUpnFromWindowsIdentity(this.windowsIdentity))); this.windowsIdentity.Dispose(); this.windowsIdentity = null; } } } } string GetUpnFromWindowsIdentity(WindowsIdentity windowsIdentity) { string downlevelName = null; string upnName = null; try { downlevelName = windowsIdentity.Name; upnName = GetUpnFromDownlevelName(downlevelName); } #pragma warning suppress 56500 // covered by FxCOP catch (Exception e) { if (Diagnostics.ExceptionUtility.IsFatal(e)) { throw; } DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Warning); } // if the AD cannot be queried for the fully qualified domain name, // fall back to the downlevel UPN name return upnName ?? downlevelName; } // Duplicate code from SecurityImpersonationBehavior string GetUpnFromDownlevelName(string downlevelName) { if (downlevelName == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("downlevelName"); } int delimiterPos = downlevelName.IndexOf('\\'); if ((delimiterPos < 0) || (delimiterPos == 0) || (delimiterPos == downlevelName.Length - 1)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new InvalidOperationException(SR.GetString(SR.DownlevelNameCannotMapToUpn, downlevelName))); } string shortDomainName = downlevelName.Substring(0, delimiterPos + 1); string userName = downlevelName.Substring(delimiterPos + 1); string fullDomainName; uint capacity = 50; StringBuilder fullyQualifiedDomainName = new StringBuilder((int)capacity); if (!SafeNativeMethods.TranslateName(shortDomainName, EXTENDED_NAME_FORMAT.NameSamCompatible, EXTENDED_NAME_FORMAT.NameCanonical, fullyQualifiedDomainName, out capacity)) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == (int)Win32Error.ERROR_INSUFFICIENT_BUFFER) { fullyQualifiedDomainName = new StringBuilder((int)capacity); if (!SafeNativeMethods.TranslateName(shortDomainName, EXTENDED_NAME_FORMAT.NameSamCompatible, EXTENDED_NAME_FORMAT.NameCanonical, fullyQualifiedDomainName, out capacity)) { errorCode = Marshal.GetLastWin32Error(); throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new Win32Exception(errorCode)); } } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new Win32Exception(errorCode)); } } // trim the trailing / from fqdn fullyQualifiedDomainName = fullyQualifiedDomainName.Remove(fullyQualifiedDomainName.Length - 1, 1); fullDomainName = fullyQualifiedDomainName.ToString(); return userName + "@" + fullDomainName; } internal override void WriteContentsTo(XmlDictionaryWriter writer) { if (writer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer"); writer.WriteElementString(XD.AddressingDictionary.Upn, XD.AddressingDictionary.IdentityExtensionNamespace, (string)this.IdentityClaim.Resource); } internal SecurityIdentifier GetUpnSid() { DiagnosticUtility.DebugAssert(ClaimTypes.Upn.Equals(this.IdentityClaim.ClaimType), ""); if (!hasUpnSidBeenComputed) { lock (thisLock) { string upn = (string)this.IdentityClaim.Resource; if (!hasUpnSidBeenComputed) { try { NTAccount userAccount = new NTAccount(upn); this.upnSid = userAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier; } #pragma warning suppress 56500 // covered by FxCOP catch (Exception e) { // Always immediately rethrow fatal exceptions. if (DiagnosticUtility.IsFatal(e)) throw; if (e is NullReferenceException || e is SEHException) throw; SecurityTraceRecordHelper.TraceSpnToSidMappingFailure(upn, e); } finally { hasUpnSidBeenComputed = true; } } } } return this.upnSid; } } } // 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
- EmptyControlCollection.cs
- XamlFigureLengthSerializer.cs
- Point3DCollection.cs
- DesignUtil.cs
- StatusBarAutomationPeer.cs
- JobDuplex.cs
- OwnerDrawPropertyBag.cs
- AnnouncementClient.cs
- WebPartMovingEventArgs.cs
- ProxyElement.cs
- ValueSerializerAttribute.cs
- RedirectionProxy.cs
- UTF8Encoding.cs
- MessageBox.cs
- SettingsSavedEventArgs.cs
- EventManager.cs
- CatalogZoneBase.cs
- MailAddressCollection.cs
- EmissiveMaterial.cs
- WorkflowExecutor.cs
- OrderByExpression.cs
- ProcessHostConfigUtils.cs
- TextParagraphProperties.cs
- DbProviderSpecificTypePropertyAttribute.cs
- _AutoWebProxyScriptEngine.cs
- BinaryObjectWriter.cs
- SafeProcessHandle.cs
- Attachment.cs
- HtmlTableRowCollection.cs
- SafeHandles.cs
- RenderDataDrawingContext.cs
- LinqDataSourceInsertEventArgs.cs
- PolyQuadraticBezierSegment.cs
- SQLUtility.cs
- NoneExcludedImageIndexConverter.cs
- TypedTableHandler.cs
- streamingZipPartStream.cs
- SAPICategories.cs
- CodeIdentifier.cs
- SrgsSubset.cs
- DynamicUpdateCommand.cs
- DesignRelationCollection.cs
- Attribute.cs
- SponsorHelper.cs
- Span.cs
- WebBrowserDesigner.cs
- HostExecutionContextManager.cs
- UnsafeNativeMethodsCLR.cs
- SHA1Managed.cs
- SiteMapDataSourceView.cs
- xml.cs
- OdbcConnectionFactory.cs
- ComponentResourceKey.cs
- X509PeerCertificateElement.cs
- EncryptedKey.cs
- ChangePasswordDesigner.cs
- LexicalChunk.cs
- CursorEditor.cs
- DataSourceCache.cs
- PrintPreviewDialog.cs
- CodeAccessSecurityEngine.cs
- HttpHandler.cs
- BinaryObjectInfo.cs
- ToolBarButton.cs
- UnwrappedTypesXmlSerializerManager.cs
- XamlContextStack.cs
- Stacktrace.cs
- xml.cs
- GrammarBuilderDictation.cs
- BitmapCodecInfoInternal.cs
- CollectionConverter.cs
- CapacityStreamGeometryContext.cs
- ZoneButton.cs
- NamespaceListProperty.cs
- PathFigureCollectionConverter.cs
- Geometry3D.cs
- MarginsConverter.cs
- CompilationRelaxations.cs
- HyperLinkDataBindingHandler.cs
- EmbossBitmapEffect.cs
- RecognizedAudio.cs
- DataGridViewCellStyleChangedEventArgs.cs
- RSACryptoServiceProvider.cs
- InitializationEventAttribute.cs
- SamlAssertionDirectKeyIdentifierClause.cs
- MonthChangedEventArgs.cs
- DBParameter.cs
- TreeNodeStyleCollection.cs
- MD5CryptoServiceProvider.cs
- ExpandCollapsePattern.cs
- TriState.cs
- HTMLTextWriter.cs
- CalloutQueueItem.cs
- UrlRoutingHandler.cs
- ResourceAttributes.cs
- PropertyConverter.cs
- BindToObject.cs
- DatasetMethodGenerator.cs
- ShapingEngine.cs
- SiteMapDataSourceDesigner.cs