private static bool RequiresInfoCard(PolicyElement[] chain, out Uri relyingPartyIssuer)
        {
            relyingPartyIssuer = null;
            if (chain.Length == 0)
            {
                return(false);
            }
            int  index = chain.Length - 1;
            int  num2  = -1;
            bool flag  = false;

            if (1 == chain.Length)
            {
                if (((null == chain[index].Issuer) || chain[index].Issuer.IsAnonymous) || (SelfIssuerUri.Equals(chain[index].Issuer.Uri) || ((null != chain[index].Issuer) && (chain[index].Binding == null))))
                {
                    num2 = index;
                    flag = true;
                }
                else if (!chain[index].IsManagedIssuer)
                {
                    flag = false;
                }
            }
            else
            {
                if (chain[index].IsManagedIssuer)
                {
                    num2 = index - 1;
                    flag = true;
                }
                else if (((null == chain[index].Issuer) || chain[index].Issuer.IsAnonymous) || (SelfIssuerUri.Equals(chain[index].Issuer.Uri) || ((null != chain[index].Issuer) && (chain[index].Binding == null))))
                {
                    num2 = index;
                    flag = true;
                }
                else
                {
                    flag = false;
                }
                for (int i = 0; i < index; i++)
                {
                    if ((chain[i].IsManagedIssuer || SelfIssuerUri.Equals(chain[i].Issuer.Uri)) || ((null == chain[i].Issuer) || chain[i].Issuer.IsAnonymous))
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("InfoCardInvalidChain")));
                    }
                }
            }
            if (flag)
            {
                relyingPartyIssuer = (null == chain[num2].Issuer) ? null : chain[num2].Issuer.Uri;
            }
            return(flag);
        }
 private static void FindInfoCardIssuerBinding(SecurityBindingElement secBindingElement, ThrowOnMultipleAssignment <IssuedSecurityTokenParameters> issuedSecurityTokenParameters)
 {
     if (secBindingElement != null)
     {
         SecurityTokenParametersEnumerable enumerable = new SecurityTokenParametersEnumerable(secBindingElement);
         foreach (SecurityTokenParameters parameters in enumerable)
         {
             IssuedSecurityTokenParameters parameters2 = parameters as IssuedSecurityTokenParameters;
             if ((parameters2 != null) && (((parameters2.IssuerBinding == null) || (parameters2.IssuerAddress == null)) || ((parameters2.IssuerAddress.IsAnonymous || SelfIssuerUri.Equals(parameters2.IssuerAddress)) || IsReferralToManagedIssuer(parameters2.IssuerBinding))))
             {
                 if (issuedSecurityTokenParameters != null)
                 {
                     issuedSecurityTokenParameters.Value = parameters2;
                 }
             }
             else if (parameters is SecureConversationSecurityTokenParameters)
             {
                 IssuedSecurityTokenParameters parameters3 = TryGetNextStsIssuedTokenParameters(((SecureConversationSecurityTokenParameters)parameters).BootstrapSecurityBindingElement);
                 if ((parameters3 != null) && (issuedSecurityTokenParameters != null))
                 {
                     issuedSecurityTokenParameters.Value = parameters3;
                 }
             }
             else if (((parameters2 != null) && (parameters2.IssuerBinding != null)) && ((TryGetNextStsIssuedTokenParameters(parameters2.IssuerBinding.CreateBindingElements().Find <SecurityBindingElement>()) != null) && (issuedSecurityTokenParameters != null)))
             {
                 issuedSecurityTokenParameters.Value = parameters2;
             }
         }
     }
 }