Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Security / ChannelProtectionRequirements.cs / 1 / ChannelProtectionRequirements.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Security { using System.Runtime.Serialization; using System.ServiceModel.Channels; using System.ServiceModel; using System.ServiceModel.Description; using System.ServiceModel.Security; using System.Net.Security; using System.Xml; public class ChannelProtectionRequirements { ScopedMessagePartSpecification incomingSignatureParts; ScopedMessagePartSpecification incomingEncryptionParts; ScopedMessagePartSpecification outgoingSignatureParts; ScopedMessagePartSpecification outgoingEncryptionParts; bool isReadOnly; public ChannelProtectionRequirements() { this.incomingSignatureParts = new ScopedMessagePartSpecification(); this.incomingEncryptionParts = new ScopedMessagePartSpecification(); this.outgoingSignatureParts = new ScopedMessagePartSpecification(); this.outgoingEncryptionParts = new ScopedMessagePartSpecification(); } public bool IsReadOnly { get { return this.isReadOnly; } } public ChannelProtectionRequirements(ChannelProtectionRequirements other) { if (other == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("other")); this.incomingSignatureParts = new ScopedMessagePartSpecification(other.incomingSignatureParts); this.incomingEncryptionParts = new ScopedMessagePartSpecification(other.incomingEncryptionParts); this.outgoingSignatureParts = new ScopedMessagePartSpecification(other.outgoingSignatureParts); this.outgoingEncryptionParts = new ScopedMessagePartSpecification(other.outgoingEncryptionParts); } internal ChannelProtectionRequirements(ChannelProtectionRequirements other, ProtectionLevel newBodyProtectionLevel) { if (other == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("other")); this.incomingSignatureParts = new ScopedMessagePartSpecification(other.incomingSignatureParts, newBodyProtectionLevel != ProtectionLevel.None); this.incomingEncryptionParts = new ScopedMessagePartSpecification(other.incomingEncryptionParts, newBodyProtectionLevel == ProtectionLevel.EncryptAndSign); this.outgoingSignatureParts = new ScopedMessagePartSpecification(other.outgoingSignatureParts, newBodyProtectionLevel != ProtectionLevel.None); this.outgoingEncryptionParts = new ScopedMessagePartSpecification(other.outgoingEncryptionParts, newBodyProtectionLevel == ProtectionLevel.EncryptAndSign); } public ScopedMessagePartSpecification IncomingSignatureParts { get { return this.incomingSignatureParts; } } public ScopedMessagePartSpecification IncomingEncryptionParts { get { return this.incomingEncryptionParts; } } public ScopedMessagePartSpecification OutgoingSignatureParts { get { return this.outgoingSignatureParts; } } public ScopedMessagePartSpecification OutgoingEncryptionParts { get { return this.outgoingEncryptionParts; } } public void Add(ChannelProtectionRequirements protectionRequirements) { this.Add(protectionRequirements, false); } public void Add(ChannelProtectionRequirements protectionRequirements, bool channelScopeOnly) { if (protectionRequirements == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("protectionRequirements")); if (protectionRequirements.incomingSignatureParts != null) this.incomingSignatureParts.AddParts(protectionRequirements.incomingSignatureParts.ChannelParts); if (protectionRequirements.incomingEncryptionParts != null) this.incomingEncryptionParts.AddParts(protectionRequirements.incomingEncryptionParts.ChannelParts); if (protectionRequirements.outgoingSignatureParts != null) this.outgoingSignatureParts.AddParts(protectionRequirements.outgoingSignatureParts.ChannelParts); if (protectionRequirements.outgoingEncryptionParts != null) this.outgoingEncryptionParts.AddParts(protectionRequirements.outgoingEncryptionParts.ChannelParts); if (!channelScopeOnly) { AddActionParts(this.incomingSignatureParts, protectionRequirements.incomingSignatureParts); AddActionParts(this.incomingEncryptionParts, protectionRequirements.incomingEncryptionParts); AddActionParts(this.outgoingSignatureParts, protectionRequirements.outgoingSignatureParts); AddActionParts(this.outgoingEncryptionParts, protectionRequirements.outgoingEncryptionParts); } } static void AddActionParts(ScopedMessagePartSpecification to, ScopedMessagePartSpecification from) { foreach (string action in from.Actions) { MessagePartSpecification p; if (from.TryGetParts(action, true, out p)) to.AddParts(p, action); } } public void MakeReadOnly() { if (!this.isReadOnly) { this.incomingSignatureParts.MakeReadOnly(); this.incomingEncryptionParts.MakeReadOnly(); this.outgoingSignatureParts.MakeReadOnly(); this.outgoingEncryptionParts.MakeReadOnly(); this.isReadOnly = true; } } public ChannelProtectionRequirements CreateInverse() { ChannelProtectionRequirements result = new ChannelProtectionRequirements(); result.Add(this, true); result.incomingSignatureParts = new ScopedMessagePartSpecification(this.OutgoingSignatureParts); result.outgoingSignatureParts = new ScopedMessagePartSpecification(this.IncomingSignatureParts); result.incomingEncryptionParts = new ScopedMessagePartSpecification(this.OutgoingEncryptionParts); result.outgoingEncryptionParts = new ScopedMessagePartSpecification(this.IncomingEncryptionParts); return result; } internal static ChannelProtectionRequirements CreateFromContract(ContractDescription contract, ISecurityCapabilities bindingElement, bool isForClient) { return CreateFromContract(contract, bindingElement.SupportedRequestProtectionLevel, bindingElement.SupportedResponseProtectionLevel, isForClient); } static MessagePartSpecification UnionMessagePartSpecifications(ScopedMessagePartSpecification actionParts) { MessagePartSpecification result = new MessagePartSpecification(false); foreach (string action in actionParts.Actions) { MessagePartSpecification parts; if (actionParts.TryGetParts(action, out parts)) { if (parts.IsBodyIncluded) { result.IsBodyIncluded = true; } foreach (XmlQualifiedName headerType in parts.HeaderTypes) { if (!result.IsHeaderIncluded(headerType.Name, headerType.Namespace)) { result.HeaderTypes.Add(headerType); } } } } return result; } internal static ChannelProtectionRequirements CreateFromContractAndUnionResponseProtectionRequirements(ContractDescription contract, ISecurityCapabilities bindingElement, bool isForClient) { ChannelProtectionRequirements contractRequirements = CreateFromContract(contract, bindingElement.SupportedRequestProtectionLevel, bindingElement.SupportedResponseProtectionLevel, isForClient); // union all the protection requirements for the response actions ChannelProtectionRequirements result = new ChannelProtectionRequirements(); //if (isForClient) //{ // result.IncomingEncryptionParts.AddParts(UnionMessagePartSpecifications(contractRequirements.IncomingEncryptionParts), MessageHeaders.WildcardAction); // result.IncomingSignatureParts.AddParts(UnionMessagePartSpecifications(contractRequirements.IncomingSignatureParts), MessageHeaders.WildcardAction); // contractRequirements.OutgoingEncryptionParts.CopyTo(result.OutgoingEncryptionParts); // contractRequirements.OutgoingSignatureParts.CopyTo(result.OutgoingSignatureParts); //} //else //{ result.OutgoingEncryptionParts.AddParts(UnionMessagePartSpecifications(contractRequirements.OutgoingEncryptionParts), MessageHeaders.WildcardAction); result.OutgoingSignatureParts.AddParts(UnionMessagePartSpecifications(contractRequirements.OutgoingSignatureParts), MessageHeaders.WildcardAction); contractRequirements.IncomingEncryptionParts.CopyTo(result.IncomingEncryptionParts); contractRequirements.IncomingSignatureParts.CopyTo(result.IncomingSignatureParts); //} return result; } internal static ChannelProtectionRequirements CreateFromContract(ContractDescription contract, ProtectionLevel defaultRequestProtectionLevel, ProtectionLevel defaultResponseProtectionLevel, bool isForClient) { if (contract == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("contract")); ChannelProtectionRequirements requirements = new ChannelProtectionRequirements(); ProtectionLevel contractScopeDefaultRequestProtectionLevel; ProtectionLevel contractScopeDefaultResponseProtectionLevel; if (contract.HasProtectionLevel) { contractScopeDefaultRequestProtectionLevel = contract.ProtectionLevel; contractScopeDefaultResponseProtectionLevel = contract.ProtectionLevel; } else { contractScopeDefaultRequestProtectionLevel = defaultRequestProtectionLevel; contractScopeDefaultResponseProtectionLevel = defaultResponseProtectionLevel; } foreach (OperationDescription operation in contract.Operations) { ProtectionLevel operationScopeDefaultRequestProtectionLevel; ProtectionLevel operationScopeDefaultResponseProtectionLevel; if (operation.HasProtectionLevel) { operationScopeDefaultRequestProtectionLevel = operation.ProtectionLevel; operationScopeDefaultResponseProtectionLevel = operation.ProtectionLevel; } else { operationScopeDefaultRequestProtectionLevel = contractScopeDefaultRequestProtectionLevel; operationScopeDefaultResponseProtectionLevel = contractScopeDefaultResponseProtectionLevel; } foreach (MessageDescription message in operation.Messages) { ProtectionLevel messageScopeDefaultProtectionLevel; if (message.HasProtectionLevel) { messageScopeDefaultProtectionLevel = message.ProtectionLevel; } else if (message.Direction == MessageDirection.Input) { messageScopeDefaultProtectionLevel = operationScopeDefaultRequestProtectionLevel; } else { messageScopeDefaultProtectionLevel = operationScopeDefaultResponseProtectionLevel; } MessagePartSpecification signedParts = new MessagePartSpecification(); MessagePartSpecification encryptedParts = new MessagePartSpecification(); // determine header protection requirements for message foreach (MessageHeaderDescription header in message.Headers) { AddHeaderProtectionRequirements(header, signedParts, encryptedParts, messageScopeDefaultProtectionLevel); } // determine body protection requirements for message ProtectionLevel bodyProtectionLevel; if (message.Body.Parts.Count > 0) { // initialize the body protection level to none. all the body parts will be // unioned to get the effective body protection level bodyProtectionLevel = ProtectionLevel.None; } else if (message.Body.ReturnValue != null) { if (!(message.Body.ReturnValue.GetType().Equals(typeof(MessagePartDescription)))) { DiagnosticUtility.DebugAssert("Only body return values are supported currently"); throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.OnlyBodyReturnValuesSupported))); } MessagePartDescription desc = message.Body.ReturnValue; bodyProtectionLevel = desc.HasProtectionLevel ? desc.ProtectionLevel : messageScopeDefaultProtectionLevel; } else { bodyProtectionLevel = messageScopeDefaultProtectionLevel; } // determine body protection requirements for message if (message.Body.Parts.Count > 0) { foreach (MessagePartDescription body in message.Body.Parts) { ProtectionLevel partProtectionLevel = body.HasProtectionLevel ? body.ProtectionLevel : messageScopeDefaultProtectionLevel; bodyProtectionLevel = ProtectionLevelHelper.Max(bodyProtectionLevel, partProtectionLevel); if (bodyProtectionLevel == ProtectionLevel.EncryptAndSign) break; } } if (bodyProtectionLevel != ProtectionLevel.None) { signedParts.IsBodyIncluded = true; if (bodyProtectionLevel == ProtectionLevel.EncryptAndSign) encryptedParts.IsBodyIncluded = true; } // add requirements for message if (message.Direction == MessageDirection.Input) { requirements.IncomingSignatureParts.AddParts(signedParts, message.Action); requirements.IncomingEncryptionParts.AddParts(encryptedParts, message.Action); } else { requirements.OutgoingSignatureParts.AddParts(signedParts, message.Action); requirements.OutgoingEncryptionParts.AddParts(encryptedParts, message.Action); } } if (operation.Faults != null) { if (operation.IsServerInitiated()) { AddFaultProtectionRequirements(operation.Faults, requirements, operationScopeDefaultRequestProtectionLevel, true); } else { AddFaultProtectionRequirements(operation.Faults, requirements, operationScopeDefaultResponseProtectionLevel, false); } } } return requirements; } static void AddHeaderProtectionRequirements(MessageHeaderDescription header, MessagePartSpecification signedParts, MessagePartSpecification encryptedParts, ProtectionLevel defaultProtectionLevel) { ProtectionLevel p = header.HasProtectionLevel ? header.ProtectionLevel : defaultProtectionLevel; if (p != ProtectionLevel.None) { XmlQualifiedName headerName = new XmlQualifiedName(header.Name, header.Namespace); signedParts.HeaderTypes.Add(headerName); if (p == ProtectionLevel.EncryptAndSign) encryptedParts.HeaderTypes.Add(headerName); } } static void AddFaultProtectionRequirements(FaultDescriptionCollection faults, ChannelProtectionRequirements requirements, ProtectionLevel defaultProtectionLevel, bool addToIncoming) { if (faults == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("faults")); if (requirements == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("requirements")); foreach (FaultDescription fault in faults) { MessagePartSpecification signedParts = new MessagePartSpecification(); MessagePartSpecification encryptedParts = new MessagePartSpecification(); ProtectionLevel p = fault.HasProtectionLevel ? fault.ProtectionLevel : defaultProtectionLevel; if (p != ProtectionLevel.None) { signedParts.IsBodyIncluded = true; if (p == ProtectionLevel.EncryptAndSign) { encryptedParts.IsBodyIncluded = true; } } if (addToIncoming) { requirements.IncomingSignatureParts.AddParts(signedParts, fault.Action); requirements.IncomingEncryptionParts.AddParts(encryptedParts, fault.Action); } else { requirements.OutgoingSignatureParts.AddParts(signedParts, fault.Action); requirements.OutgoingEncryptionParts.AddParts(encryptedParts, fault.Action); } } } } } // 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
- LinqToSqlWrapper.cs
- ProfileInfo.cs
- OleDbConnection.cs
- MessageSmuggler.cs
- DuplexChannelFactory.cs
- SelectedDatesCollection.cs
- SendSecurityHeader.cs
- DBSchemaTable.cs
- SoundPlayerAction.cs
- ChildrenQuery.cs
- TransactionException.cs
- MailSettingsSection.cs
- MexNamedPipeBindingCollectionElement.cs
- BevelBitmapEffect.cs
- AttachmentService.cs
- ServiceNameElementCollection.cs
- ComplexTypeEmitter.cs
- DrawingContextWalker.cs
- PostBackTrigger.cs
- XhtmlBasicTextViewAdapter.cs
- PeoplePickerWrapper.cs
- TransportSecurityHelpers.cs
- SendKeys.cs
- Pkcs7Signer.cs
- PageParser.cs
- Membership.cs
- WebPartChrome.cs
- ActiveDocumentEvent.cs
- HMACSHA384.cs
- EarlyBoundInfo.cs
- PermissionSetTriple.cs
- ItemCollection.cs
- ReadOnlyDataSource.cs
- MultiPropertyDescriptorGridEntry.cs
- TextSelection.cs
- MemberInitExpression.cs
- Border.cs
- CapabilitiesAssignment.cs
- HMACSHA256.cs
- Color.cs
- WSDualHttpBindingElement.cs
- BooleanStorage.cs
- iisPickupDirectory.cs
- localization.cs
- UnmanagedHandle.cs
- httpapplicationstate.cs
- ProxyDataContractResolver.cs
- ObjectSpanRewriter.cs
- OletxEnlistment.cs
- TransformedBitmap.cs
- HttpCapabilitiesEvaluator.cs
- ImageDesigner.cs
- QuerySetOp.cs
- InteropAutomationProvider.cs
- WindowsGrip.cs
- PreviewKeyDownEventArgs.cs
- RenderData.cs
- EventKeyword.cs
- UnsafeCollabNativeMethods.cs
- DesignerAttribute.cs
- SegmentInfo.cs
- DataControlPagerLinkButton.cs
- Console.cs
- TerminatorSinks.cs
- BaseAppDomainProtocolHandler.cs
- X509CertificateCollection.cs
- ColorKeyFrameCollection.cs
- CategoryEditor.cs
- ColorConverter.cs
- DBSchemaTable.cs
- PersonalizablePropertyEntry.cs
- KeyedByTypeCollection.cs
- PersianCalendar.cs
- CodeSubDirectory.cs
- DbConnectionPoolIdentity.cs
- DataGridViewComponentPropertyGridSite.cs
- ErrorProvider.cs
- StylusOverProperty.cs
- ClientApiGenerator.cs
- WebConfigurationHostFileChange.cs
- Manipulation.cs
- CheckableControlBaseAdapter.cs
- ConnectionProviderAttribute.cs
- StringFunctions.cs
- FontEmbeddingManager.cs
- LayoutManager.cs
- CheckedPointers.cs
- BasePattern.cs
- ToolStripItemImageRenderEventArgs.cs
- RoleManagerEventArgs.cs
- ComponentManagerBroker.cs
- GeneralTransform3DTo2DTo3D.cs
- SecurityPolicySection.cs
- RelationshipEnd.cs
- PageContent.cs
- ApplicationTrust.cs
- RectConverter.cs
- Rotation3DAnimationBase.cs
- ProcessInfo.cs
- StringDictionary.cs