Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- HttpWrapper.cs
- MobileComponentEditorPage.cs
- Line.cs
- RemoteArgument.cs
- HelpProvider.cs
- BoolExpr.cs
- Function.cs
- ServicePoint.cs
- CatalogZone.cs
- PathFigureCollection.cs
- X509Extension.cs
- CertificateManager.cs
- DynamicEndpoint.cs
- MTConfigUtil.cs
- SmtpNegotiateAuthenticationModule.cs
- CapabilitiesUse.cs
- UDPClient.cs
- TextEditorParagraphs.cs
- RemoteWebConfigurationHostServer.cs
- GridEntry.cs
- ValidatingPropertiesEventArgs.cs
- DataTableReaderListener.cs
- TimeoutException.cs
- RenderTargetBitmap.cs
- RecognizerStateChangedEventArgs.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- TypeSystem.cs
- DocumentViewerConstants.cs
- TransformerInfoCollection.cs
- FontStyleConverter.cs
- HtmlElementErrorEventArgs.cs
- Stylus.cs
- XMLSchema.cs
- LogRecordSequence.cs
- HtmlHead.cs
- CursorConverter.cs
- IndexedWhereQueryOperator.cs
- CapabilitiesRule.cs
- ExpressionConverter.cs
- Exception.cs
- InsufficientMemoryException.cs
- CodeIdentifiers.cs
- AssemblyInfo.cs
- XamlSerializer.cs
- SubstitutionResponseElement.cs
- CheckBoxFlatAdapter.cs
- CommandHelper.cs
- NavigationPropertyEmitter.cs
- serverconfig.cs
- StringAnimationUsingKeyFrames.cs
- Helper.cs
- EventData.cs
- TimeSpanOrInfiniteConverter.cs
- InvalidateEvent.cs
- StringExpressionSet.cs
- CompModSwitches.cs
- MarkupCompiler.cs
- FrameworkElement.cs
- Parameter.cs
- PcmConverter.cs
- TypeDelegator.cs
- FormatConvertedBitmap.cs
- XmlSerializerSection.cs
- Visitor.cs
- DocumentsTrace.cs
- WindowsListViewGroupSubsetLink.cs
- ColumnBinding.cs
- PassportAuthenticationEventArgs.cs
- OleDbReferenceCollection.cs
- RoutedEventHandlerInfo.cs
- QuadraticBezierSegment.cs
- EntityDataSourceWizardForm.cs
- Model3DGroup.cs
- XmlObjectSerializer.cs
- COM2AboutBoxPropertyDescriptor.cs
- UnsafeNativeMethodsMilCoreApi.cs
- GuidTagList.cs
- HtmlAnchor.cs
- StringFreezingAttribute.cs
- QueryableDataSourceHelper.cs
- ToolboxComponentsCreatedEventArgs.cs
- XmlExpressionDumper.cs
- SizeAnimationClockResource.cs
- BindingCollection.cs
- MouseButtonEventArgs.cs
- QilScopedVisitor.cs
- Translator.cs
- ToolbarAUtomationPeer.cs
- TabControl.cs
- NumberEdit.cs
- Int32Storage.cs
- NameObjectCollectionBase.cs
- Object.cs
- PrimaryKeyTypeConverter.cs
- EntityRecordInfo.cs
- ACL.cs
- WebSysDefaultValueAttribute.cs
- WorkflowRuntimeService.cs
- ManagementBaseObject.cs
- DataBinder.cs