LaxModeSecurityHeaderElementInferenceEngine.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Security / LaxModeSecurityHeaderElementInferenceEngine.cs / 1 / LaxModeSecurityHeaderElementInferenceEngine.cs

                            //---------------------------------------------------------- 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------

namespace System.ServiceModel.Security 
{
    using System.ServiceModel.Channels; 
    using System.ServiceModel.Security.Tokens; 
    using System.Xml;
 
    using SignedXml = System.IdentityModel.SignedXml;
    using StandardSignedInfo = System.IdentityModel.StandardSignedInfo;

    class LaxModeSecurityHeaderElementInferenceEngine : SecurityHeaderElementInferenceEngine 
    {
        static LaxModeSecurityHeaderElementInferenceEngine instance = new LaxModeSecurityHeaderElementInferenceEngine(); 
 
        protected LaxModeSecurityHeaderElementInferenceEngine() {}
 
        internal static LaxModeSecurityHeaderElementInferenceEngine Instance
        {
            get { return instance; }
        } 

        public override void ExecuteProcessingPasses(ReceiveSecurityHeader securityHeader, XmlDictionaryReader reader) 
        { 
            // pass 1
            securityHeader.ExecuteReadingPass(reader); 

            // pass 1.5
            securityHeader.ExecuteDerivedKeyTokenStubPass(false);
 
            // pass 2
            securityHeader.ExecuteSubheaderDecryptionPass(); 
 
            // pass 2.5
            securityHeader.ExecuteDerivedKeyTokenStubPass(true); 

            // layout-specific inferences
            MarkElements(securityHeader.ElementManager, securityHeader.RequireMessageProtection);
 
            // pass 3
            securityHeader.ExecuteSignatureEncryptionProcessingPass(); 
        } 

        public override void MarkElements(ReceiveSecurityHeaderElementManager elementManager, bool messageSecurityMode) 
        {
            bool primarySignatureFound = false;
            for (int position = 0; position < elementManager.Count; position++)
            { 
                ReceiveSecurityHeaderEntry entry;
                elementManager.GetElementEntry(position, out entry); 
                if (entry.elementCategory == ReceiveSecurityHeaderElementCategory.Signature) 
                {
                    if (!messageSecurityMode) 
                    {
                        elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing);
                        continue;
                    } 
                    SignedXml signedXml = (SignedXml) entry.element;
                    StandardSignedInfo signedInfo = (StandardSignedInfo) signedXml.Signature.SignedInfo; 
                    bool targetsSignature = false; 
                    if (signedInfo.ReferenceCount == 1)
                    { 
                        string uri = signedInfo[0].Uri;
                        string id;
                        if (uri != null && uri.Length > 1 && uri[0] == '#')
                        { 
                            id = uri.Substring(1);
                        } 
                        else 
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( 
                                new MessageSecurityException(SR.GetString(SR.UnableToResolveReferenceUriForSignature, uri)));
                        }
                        for (int j = 0; j < elementManager.Count; j++)
                        { 
                            ReceiveSecurityHeaderEntry inner;
                            elementManager.GetElementEntry(j, out inner); 
                            if (j != position && inner.elementCategory == ReceiveSecurityHeaderElementCategory.Signature && inner.id == id) 
                            {
                                targetsSignature = true; 
                                break;
                            }
                        }
                    } 
                    if (targetsSignature)
                    { 
                        elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing); 
                        continue;
                    } 
                    else
                    {
                        if (primarySignatureFound)
                        { 
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.AtMostOnePrimarySignatureInReceiveSecurityHeader)));
                        } 
                        primarySignatureFound = true; 
                        elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Primary);
                        continue; 
                    }
                }
            }
        } 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK