Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / IdentityModel / System / IdentityModel / Claims / ClaimComparer.cs / 1 / ClaimComparer.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.IdentityModel.Claims { using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; class ClaimComparer : IEqualityComparer{ static IEqualityComparer defaultComparer; static IEqualityComparer hashComparer; static IEqualityComparer dnsComparer; static IEqualityComparer rsaComparer; static IEqualityComparer thumbprintComparer; static IEqualityComparer upnComparer; static IEqualityComparer x500DistinguishedNameComparer; IEqualityComparer resourceComparer; ClaimComparer(IEqualityComparer resourceComparer) { this.resourceComparer = resourceComparer; } public static IEqualityComparer GetComparer(string claimType) { if (claimType == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("claimType"); if (claimType == ClaimTypes.Dns) return Dns; if (claimType == ClaimTypes.Hash) return Hash; if (claimType == ClaimTypes.Rsa) return Rsa; if (claimType == ClaimTypes.Thumbprint) return Thumbprint; if (claimType == ClaimTypes.Upn) return Upn; if (claimType == ClaimTypes.X500DistinguishedName) return X500DistinguishedName; return Default; } public static IEqualityComparer Default { get { if (defaultComparer == null) { defaultComparer = new ClaimComparer(new ObjectComparer()); } return defaultComparer; } } public static IEqualityComparer Dns { get { if (dnsComparer == null) { dnsComparer = new ClaimComparer(StringComparer.OrdinalIgnoreCase); } return dnsComparer; } } public static IEqualityComparer Hash { get { if (hashComparer == null) { hashComparer = new ClaimComparer(new BinaryObjectComparer()); } return hashComparer; } } public static IEqualityComparer Rsa { get { if (rsaComparer == null) { rsaComparer = new ClaimComparer(new RsaObjectComparer()); } return rsaComparer; } } public static IEqualityComparer Thumbprint { get { if (thumbprintComparer == null) { thumbprintComparer = new ClaimComparer(new BinaryObjectComparer()); } return thumbprintComparer; } } public static IEqualityComparer Upn { get { if (upnComparer == null) { upnComparer = new ClaimComparer(new UpnObjectComparer()); } return upnComparer; } } public static IEqualityComparer X500DistinguishedName { get { if (x500DistinguishedNameComparer == null) { x500DistinguishedNameComparer = new ClaimComparer(new X500DistinguishedNameObjectComparer()); } return x500DistinguishedNameComparer; } } // we still need to review how the default equals works, this is not how Doug envisioned it. public bool Equals(Claim claim1, Claim claim2) { if (ReferenceEquals(claim1, claim2)) return true; if (claim1 == null || claim2 == null) return false; if (claim1.ClaimType != claim2.ClaimType || claim1.Right != claim2.Right) return false; return resourceComparer.Equals(claim1.Resource, claim2.Resource); } public int GetHashCode(Claim claim) { if (claim == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("claim"); return claim.ClaimType.GetHashCode() ^ claim.Right.GetHashCode() ^ ( (claim.Resource == null) ? 0 : resourceComparer.GetHashCode(claim.Resource)); } class ObjectComparer : IEqualityComparer { bool IEqualityComparer.Equals(object obj1, object obj2) { if (obj1 == null && obj2 == null) return true; if (obj1 == null || obj2 == null) return false; return obj1.Equals(obj2); } int IEqualityComparer.GetHashCode(object obj) { if (obj == null) return 0; return obj.GetHashCode(); } } class BinaryObjectComparer : IEqualityComparer { bool IEqualityComparer.Equals(object obj1, object obj2) { if (ReferenceEquals(obj1, obj2)) return true; byte[] bytes1 = obj1 as byte[]; byte[] bytes2 = obj2 as byte[]; if (bytes1 == null || bytes2 == null) return false; if (bytes1.Length != bytes2.Length) return false; for (int i = 0; i < bytes1.Length; ++i) { if (bytes1[i] != bytes2[i]) return false; } return true; } int IEqualityComparer.GetHashCode(object obj) { byte[] bytes = obj as byte[]; if (bytes == null) return 0; int hashCode = 0; for (int i = 0; i < bytes.Length && i < 4; ++i) { hashCode = (hashCode << 8) | bytes[i]; } return hashCode ^ bytes.Length; } } class RsaObjectComparer : IEqualityComparer { bool IEqualityComparer.Equals(object obj1, object obj2) { if (ReferenceEquals(obj1, obj2)) return true; RSA rsa1 = obj1 as RSA; RSA rsa2 = obj2 as RSA; if (rsa1 == null || rsa2 == null) return false; RSAParameters parm1 = rsa1.ExportParameters(false); RSAParameters parm2 = rsa2.ExportParameters(false); if (parm1.Modulus.Length != parm2.Modulus.Length || parm1.Exponent.Length != parm2.Exponent.Length) return false; for (int i = 0; i < parm1.Modulus.Length; ++i) { if (parm1.Modulus[i] != parm2.Modulus[i]) return false; } for (int i = 0; i < parm1.Exponent.Length; ++i) { if (parm1.Exponent[i] != parm2.Exponent[i]) return false; } return true; } int IEqualityComparer.GetHashCode(object obj) { RSA rsa = obj as RSA; if (rsa == null) return 0; RSAParameters parm = rsa.ExportParameters(false); return parm.Modulus.Length ^ parm.Exponent.Length; } } class X500DistinguishedNameObjectComparer : IEqualityComparer { IEqualityComparer binaryComparer; public X500DistinguishedNameObjectComparer() { binaryComparer = new BinaryObjectComparer(); } bool IEqualityComparer.Equals(object obj1, object obj2) { if (ReferenceEquals(obj1, obj2)) return true; X500DistinguishedName dn1 = obj1 as X500DistinguishedName; X500DistinguishedName dn2 = obj2 as X500DistinguishedName; if (dn1 == null || dn2 == null) return false; // 1) Hopefully cover most cases (perf reason). if (StringComparer.Ordinal.Equals(dn1.Name, dn2.Name)) return true; // 2) Raw byte compare. Note: we assume the rawbyte is in the same order // (default = X500DistinguishedNameFlags.Reversed). return binaryComparer.Equals(dn1.RawData, dn2.RawData); } int IEqualityComparer.GetHashCode(object obj) { X500DistinguishedName dn = obj as X500DistinguishedName; if (dn == null) return 0; return binaryComparer.GetHashCode(dn.RawData); } } class UpnObjectComparer : IEqualityComparer { bool IEqualityComparer.Equals(object obj1, object obj2) { if (StringComparer.OrdinalIgnoreCase.Equals(obj1, obj2)) return true; string upn1 = obj1 as string; string upn2 = obj2 as string; if (upn1 == null || upn2 == null) return false; SecurityIdentifier sid1; if (!TryLookupSidFromName(upn1, out sid1)) return false; // Normalize to sid SecurityIdentifier sid2; if (!TryLookupSidFromName(upn2, out sid2)) return false; return sid1 == sid2; } int IEqualityComparer.GetHashCode(object obj) { string upn = obj as string; if (upn == null) return 0; // Normalize to sid SecurityIdentifier sid; if (TryLookupSidFromName(upn, out sid)) return sid.GetHashCode(); return StringComparer.OrdinalIgnoreCase.GetHashCode(upn); } bool TryLookupSidFromName(string upn, out SecurityIdentifier sid) { sid = null; try { NTAccount acct = new NTAccount(upn); sid = acct.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier; } catch (IdentityNotMappedException e) { if (DiagnosticUtility.ShouldTraceInformation) { DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Information); } } return sid != 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
- EntryPointNotFoundException.cs
- WebBodyFormatMessageProperty.cs
- DecimalAnimationUsingKeyFrames.cs
- OutputWindow.cs
- InplaceBitmapMetadataWriter.cs
- ScriptReferenceEventArgs.cs
- GenericPrincipal.cs
- TextElement.cs
- PersianCalendar.cs
- DropDownButton.cs
- HtmlInputText.cs
- DispatcherFrame.cs
- InputScope.cs
- VectorKeyFrameCollection.cs
- UserControlCodeDomTreeGenerator.cs
- ViewCellRelation.cs
- TextEditorTyping.cs
- OleDbConnectionInternal.cs
- BaseProcessProtocolHandler.cs
- XPathException.cs
- NamedPermissionSet.cs
- EntityFrameworkVersions.cs
- URLIdentityPermission.cs
- ObjectViewEntityCollectionData.cs
- MSHTMLHost.cs
- Binding.cs
- XPathMessageFilterElementCollection.cs
- SchemeSettingElement.cs
- _SslSessionsCache.cs
- FontDifferentiator.cs
- SafePointer.cs
- WebBrowserNavigatingEventHandler.cs
- TextCharacters.cs
- RowVisual.cs
- WmiEventSink.cs
- TemplateEditingService.cs
- SafeRightsManagementEnvironmentHandle.cs
- DataGridViewComboBoxEditingControl.cs
- XmlReflectionMember.cs
- ClientScriptManagerWrapper.cs
- SocketException.cs
- MarkupExtensionParser.cs
- XmlChoiceIdentifierAttribute.cs
- CodeObjectCreateExpression.cs
- MultiBinding.cs
- SQLByte.cs
- ImpersonationContext.cs
- PositiveTimeSpanValidator.cs
- OleDbSchemaGuid.cs
- DBConcurrencyException.cs
- QueryContinueDragEventArgs.cs
- OutputCache.cs
- LockRecoveryTask.cs
- DependencyProperty.cs
- CultureSpecificStringDictionary.cs
- ApplyImportsAction.cs
- UrlRoutingHandler.cs
- PngBitmapEncoder.cs
- MsmqBindingElementBase.cs
- InvokeProviderWrapper.cs
- ProfileParameter.cs
- AuthStoreRoleProvider.cs
- XpsFontSubsetter.cs
- SqlRowUpdatedEvent.cs
- FileUtil.cs
- MeasurementDCInfo.cs
- AnimationException.cs
- SamlAuthenticationClaimResource.cs
- ParameterElementCollection.cs
- RectangleGeometry.cs
- WindowsEditBoxRange.cs
- Signature.cs
- ConfigurationErrorsException.cs
- BufferAllocator.cs
- AllowedAudienceUriElement.cs
- InputProviderSite.cs
- BamlVersionHeader.cs
- ObjectConverter.cs
- FixedMaxHeap.cs
- WebConvert.cs
- DbDeleteCommandTree.cs
- Mappings.cs
- CodeCastExpression.cs
- WebPartZone.cs
- PackUriHelper.cs
- DeferredReference.cs
- WCFModelStrings.Designer.cs
- ToolStripRenderEventArgs.cs
- PageThemeBuildProvider.cs
- SqlDataSourceCache.cs
- ObjectNavigationPropertyMapping.cs
- XmlSchemaObjectCollection.cs
- WizardDesigner.cs
- MouseOverProperty.cs
- WS2007FederationHttpBindingCollectionElement.cs
- EdmToObjectNamespaceMap.cs
- ProcessThread.cs
- BamlMapTable.cs
- XmlnsDefinitionAttribute.cs
- OdbcUtils.cs