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
- GridViewDeleteEventArgs.cs
- BitmapCodecInfoInternal.cs
- Utils.cs
- LineBreakRecord.cs
- DtrList.cs
- SqlDataSourceStatusEventArgs.cs
- MenuItemBindingCollection.cs
- BinaryObjectReader.cs
- EnumUnknown.cs
- PrintDocument.cs
- CompiledXpathExpr.cs
- GeometryValueSerializer.cs
- FormsAuthenticationTicket.cs
- Model3D.cs
- CreateUserWizard.cs
- Wow64ConfigurationLoader.cs
- TimeManager.cs
- ObjectDataSourceSelectingEventArgs.cs
- ImmComposition.cs
- DictionaryEditChange.cs
- OutputCacheSettingsSection.cs
- EmptyElement.cs
- Debug.cs
- KeyNotFoundException.cs
- SqlCacheDependencyDatabaseCollection.cs
- XmlValidatingReaderImpl.cs
- SqlDataSourceEnumerator.cs
- InnerItemCollectionView.cs
- PrintPreviewGraphics.cs
- SessionStateItemCollection.cs
- UIElement.cs
- TdsParserStateObject.cs
- ExpressionBinding.cs
- HttpCookieCollection.cs
- LazyTextWriterCreator.cs
- smtppermission.cs
- FilterException.cs
- TrustLevelCollection.cs
- PolicyLevel.cs
- DesignerOptionService.cs
- HwndSourceParameters.cs
- RotateTransform3D.cs
- TripleDESCryptoServiceProvider.cs
- SettingsPropertyWrongTypeException.cs
- PersonalizablePropertyEntry.cs
- BaseServiceProvider.cs
- EdmConstants.cs
- SQLResource.cs
- StylusPointPropertyInfoDefaults.cs
- UIElementIsland.cs
- Help.cs
- PerformanceCounterLib.cs
- IndicShape.cs
- EmptyElement.cs
- ScaleTransform.cs
- DrawListViewItemEventArgs.cs
- BaseParagraph.cs
- XPathScanner.cs
- TagElement.cs
- MetaData.cs
- TextViewSelectionProcessor.cs
- SystemIcmpV6Statistics.cs
- DetailsView.cs
- ADMembershipProvider.cs
- SqlFunctionAttribute.cs
- ScaleTransform.cs
- BrowserCapabilitiesFactory.cs
- WebFaultClientMessageInspector.cs
- ButtonRenderer.cs
- SmiTypedGetterSetter.cs
- ExceptionUtil.cs
- PageClientProxyGenerator.cs
- SqlEnums.cs
- ChannelServices.cs
- UiaCoreTypesApi.cs
- UpdateCommand.cs
- RoleManagerModule.cs
- GeometryConverter.cs
- SqlMultiplexer.cs
- HostingMessageProperty.cs
- ClientTargetCollection.cs
- SBCSCodePageEncoding.cs
- MinimizableAttributeTypeConverter.cs
- PocoEntityKeyStrategy.cs
- QilVisitor.cs
- CryptoKeySecurity.cs
- LinkClickEvent.cs
- BehaviorEditorPart.cs
- LOSFormatter.cs
- XhtmlStyleClass.cs
- Panel.cs
- Token.cs
- WebHttpBinding.cs
- StreamDocument.cs
- ToolBarDesigner.cs
- ActivationArguments.cs
- GridViewHeaderRowPresenter.cs
- PtsPage.cs
- SystemDiagnosticsSection.cs
- UpdateException.cs