How to pass custom object between WCF client app and custom issued security token provider


There are two options:


1. OperationContext.Current.


Pros: This is pretty straightforward and relatively hard to discover. 


Cons: This is a thread local storage, and you are invoking a async call, it does not work well.


2. ChannelParameterCollection


This is very sneaky. You will need to add the object to channel first in your client app code,


                                // add the token to the channel parameter collection


                               ChannelParameterCollection parm = (ChannelParameterCollection)( (IChannel)client ).GetProperty<ChannelParameterCollection>();


                parm.Add( myState);


Then you can retrieve it from the requirement, and set it on the custom token provider


public override SecurityTokenProvider CreateSecurityTokenProvider( SecurityTokenRequirement tokenRequirement )


        {


            // retrieve the ChannelParameterCollection from the token requirements


                                ChannelParameterCollection collection = null;


                if ( !tokenRequirement.TryGetProperty<ChannelParameterCollection>( ServiceModelSecurityTokenRequirement.ChannelParametersCollectionProperty, out collection ) )


                {


                    Console.WriteLine( “could not found ChannelParameterCollection” );


                }


 


                  // now add the collection to your issuedsecuritytokenprovider


            CustomIssuedSecurityTokenProvider federationTokenProvider = new CustomIssuedSecurityTokenProvider(collection);


 


}


The last step is to simply retrieve it from the BeginGetTokenCore() method


 public class CustomIssuedSecurityTokenProvider : IssuedSecurityTokenProvider


    {


        ChannelParameterCollection _collection;


 


        /// <summary>


        /// Constructor


        /// </summary>


        public CustomIssuedSecurityTokenProvider(ChannelParameterCollection collection)


            : base()


        {


            _collection = collection;


        }


 


        ChannelParameterCollection Collection


        {


            get


            {


                return _collection;


            }


        }


        protected override IAsyncResult BeginGetTokenCore( TimeSpan timeout, AsyncCallback callback, object state )


        {


            foreach ( object o in _collection )


            {


                if ( o is someType)


                {


                    // turn it into your type


                }


            }


           


           


        }


}



Hope it helps


Comments (0)