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
- AttributeEmitter.cs
- DataServiceExpressionVisitor.cs
- NeutralResourcesLanguageAttribute.cs
- FtpWebRequest.cs
- _SingleItemRequestCache.cs
- DnsPermission.cs
- MULTI_QI.cs
- PropertiesTab.cs
- OdbcError.cs
- HttpMethodConstraint.cs
- XamlReaderHelper.cs
- WebPartMenuStyle.cs
- WebFaultException.cs
- EventArgs.cs
- DataServiceQueryOfT.cs
- DataGridRowHeader.cs
- AuthenticationManager.cs
- ThreadStaticAttribute.cs
- MachineKeySection.cs
- Range.cs
- SqlProviderUtilities.cs
- columnmapkeybuilder.cs
- HMACRIPEMD160.cs
- ConstructorBuilder.cs
- QueryOutputWriter.cs
- HTTP_SERVICE_CONFIG_URLACL_PARAM.cs
- CodeCompiler.cs
- HtmlControlAdapter.cs
- TypeValidationEventArgs.cs
- ImageMetadata.cs
- WebConvert.cs
- ChtmlPhoneCallAdapter.cs
- FastPropertyAccessor.cs
- TemplateNameScope.cs
- BulletChrome.cs
- SinglePhaseEnlistment.cs
- HttpConfigurationSystem.cs
- UidPropertyAttribute.cs
- LogAppendAsyncResult.cs
- Int32AnimationBase.cs
- SqlProfileProvider.cs
- ApplicationSecurityManager.cs
- ImportedNamespaceContextItem.cs
- CompositeDataBoundControl.cs
- ObjectViewQueryResultData.cs
- CopyOnWriteList.cs
- AnimationException.cs
- XmlSchemaAny.cs
- DataServiceConfiguration.cs
- ObjectCloneHelper.cs
- ISCIIEncoding.cs
- DragStartedEventArgs.cs
- _TransmitFileOverlappedAsyncResult.cs
- ContextStack.cs
- KeyPullup.cs
- XmlMtomWriter.cs
- CharacterMetricsDictionary.cs
- CompositeClientFormatter.cs
- TokenBasedSet.cs
- DynamicMetaObjectBinder.cs
- OdbcInfoMessageEvent.cs
- DefaultAsyncDataDispatcher.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- PolyBezierSegment.cs
- Message.cs
- ProfileModule.cs
- StorageModelBuildProvider.cs
- MSG.cs
- BlockCollection.cs
- MetadataSource.cs
- RoleBoolean.cs
- MemberHolder.cs
- ChannelManager.cs
- SqlAliasesReferenced.cs
- MarkedHighlightComponent.cs
- HwndMouseInputProvider.cs
- Vector3DAnimationBase.cs
- XmlArrayAttribute.cs
- RegexMatch.cs
- ReaderContextStackData.cs
- ChineseLunisolarCalendar.cs
- GroupItemAutomationPeer.cs
- LocatorPart.cs
- PathGeometry.cs
- AutomationEventArgs.cs
- SqlProcedureAttribute.cs
- AlignmentXValidation.cs
- HelpOperationInvoker.cs
- GridSplitter.cs
- WebPartTransformerAttribute.cs
- cookiecontainer.cs
- BuildProvider.cs
- XsdBuildProvider.cs
- CodeSubDirectoriesCollection.cs
- ObservableCollection.cs
- AppLevelCompilationSectionCache.cs
- HandlerBase.cs
- Screen.cs
- MemoryResponseElement.cs
- TaskFileService.cs