Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / IdentityModel / System / IdentityModel / Claims / ClaimComparer.cs / 1305376 / 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. //----------------------------------------------------------- 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RewritingSimplifier.cs
- ImageAnimator.cs
- ColorContext.cs
- XmlNamespaceDeclarationsAttribute.cs
- ZipIORawDataFileBlock.cs
- Activity.cs
- ButtonFieldBase.cs
- WriteTimeStream.cs
- AnonymousIdentificationModule.cs
- XmlNodeChangedEventArgs.cs
- SplitterEvent.cs
- QilIterator.cs
- StylusSystemGestureEventArgs.cs
- httpstaticobjectscollection.cs
- InstanceKeyCompleteException.cs
- EditingCommands.cs
- RoleServiceManager.cs
- MappedMetaModel.cs
- ReliabilityContractAttribute.cs
- SafeViewOfFileHandle.cs
- StringBuilder.cs
- DuplicateWaitObjectException.cs
- CryptographicAttribute.cs
- GenericEnumerator.cs
- DiscoveryClientReferences.cs
- LocalBuilder.cs
- Lasso.cs
- TypeConverterHelper.cs
- FindRequestContext.cs
- TextLine.cs
- CharEnumerator.cs
- Permission.cs
- DataGridViewLinkCell.cs
- ManipulationDelta.cs
- ProfilePropertySettingsCollection.cs
- DataRelation.cs
- ProcessInfo.cs
- ToolboxComponentsCreatedEventArgs.cs
- BitmapFrame.cs
- XmlQualifiedNameTest.cs
- InvalidProgramException.cs
- ContentElement.cs
- CounterSample.cs
- FormatConvertedBitmap.cs
- DelegatingTypeDescriptionProvider.cs
- HtmlWindowCollection.cs
- ListSortDescriptionCollection.cs
- SqlNodeTypeOperators.cs
- Visual3D.cs
- DisableDpiAwarenessAttribute.cs
- TableLayoutPanelDesigner.cs
- SafeSystemMetrics.cs
- SystemIcmpV4Statistics.cs
- SchemaAttDef.cs
- Hash.cs
- coordinator.cs
- GPPOINT.cs
- XmlTextReader.cs
- SystemResources.cs
- UInt16Converter.cs
- CellConstant.cs
- SpinLock.cs
- ListControlConvertEventArgs.cs
- ToolStripTemplateNode.cs
- SamlDoNotCacheCondition.cs
- HWStack.cs
- unsafeIndexingFilterStream.cs
- InkCanvasInnerCanvas.cs
- webproxy.cs
- DescendantOverDescendantQuery.cs
- AppDomainAttributes.cs
- AsymmetricKeyExchangeFormatter.cs
- ValidatedControlConverter.cs
- OrderedDictionary.cs
- PenCursorManager.cs
- FileDialog_Vista_Interop.cs
- MarkupProperty.cs
- ClientCultureInfo.cs
- CompositeFontFamily.cs
- GacUtil.cs
- NavigatorOutput.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- DocumentScope.cs
- CreateUserWizardStep.cs
- OletxVolatileEnlistment.cs
- SourceFilter.cs
- AuthenticationManager.cs
- SafeFindHandle.cs
- ToolStripItemEventArgs.cs
- ProfileInfo.cs
- Boolean.cs
- IOThreadScheduler.cs
- TrackingConditionCollection.cs
- TimeSpanConverter.cs
- XmlAttributes.cs
- UnionExpr.cs
- XsltFunctions.cs
- BooleanKeyFrameCollection.cs
- QilPatternVisitor.cs
- _BufferOffsetSize.cs