Though WCF routing features for content-based routing, protocol bridging, and error handling seem to be very exciting, I have faced some issues while defining their security context in Routing service environment. In this article, we will discuss custom authentication and security for routing services.
- Routing_Service_POC.zip
- Routing_Service_POC
- POC
- library
- ICSharpCode.SharpZipLib.dll
- Ionic.Zip.dll
- RoutingServicePOC
- _ReSharper.RoutingServicePOC
- BuildScriptCache
- .crc
- .version
- 5
- 9
- 6ecd42b4.dat
- DecompilerCache
- ModuleIds.xml
- NamedArguments
- .crc
- .version
- 1
- 8
- 64bd7be7.dat
- PdbInfo
- ProjectModel
- ProjectModel.dat
- Resources
- .crc
- .version
- SymbolCache.bin
- TagPrefixes
- .crc
- .version
- 0
- 1
- 2
- 5
- 5402198f.dat
- 6
- TodoCache
- .crc
- .version
- 5
- 5402198f.dat
- 7
- WebsiteFileReferences
- .crc
- .version
- WordIndex
- .crc
- .version
- 1
- 3da9581c.dat
- 3
- Client
- ClientCommonLib
- GlobalCommonLib
- RoutingServicePOC.5.1.ReSharper.user
- RoutingServicePOC.sln
- RoutingServicePOC.suo
- RoutingServicePOC
- ServiceA.Contract
- ServiceA
- ServiceB.Contract
- ServiceB
- ServiceCommonLib
- Routing_Service_POC-noexe.zip
|
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using GlobalCommonLib;
namespace ServiceCommonLib
{
public class CentralSessionDataContext : IExtension<OperationContext>
{
//The "current" custom context
public static CentralSessionDataContext Current
{
get { return OperationContext.Current.Extensions.Find<CentralSessionDataContext>(); }
}
#region IExtension<OperationContext> Members
public void Attach(OperationContext owner)
{
//no-op
}
public void Detach(OperationContext owner)
{
//no-op
}
#endregion
//You can have lots more of these -- this is the stuff that you
//want to store on your custom context
public CentralRequestSession RequestSession { get; set; }
}
public class CentralSessionDataContextBehaviorAttribute : Attribute, IServiceBehavior, IDispatchMessageInspector
{
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
IClientChannel channel,
InstanceContext instanceContext)
{
var ctx = new CentralSessionDataContext();
OperationContext.Current.Extensions.Add(ctx);
return request.Headers.MessageId;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
OperationContext.Current.Extensions.Remove(CentralSessionDataContext.Current);
}
#region IServiceBehavior Members
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
//no-op
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.MessageInspectors.Add(this);
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
//no-op
}
#endregion
}
public class CentralSessionDataContextProcessInspector : BehaviorExtensionElement, IEndpointBehavior, IDispatchMessageInspector
{
#region Overrides of BehaviorExtensionElement
/// <summary>
/// Creates a behavior extension based on the current configuration settings.
/// </summary>
/// <returns>
/// The behavior extension.
/// </returns>
protected override object CreateBehavior()
{
return new CentralSessionDataContextProcessInspector();
}
/// <summary>
/// Gets the type of behavior.
/// </summary>
/// <returns>
/// B <see cref="T:System.Type"/>.
/// </returns>
public override Type BehaviorType
{
get { return typeof(CentralSessionDataContextProcessInspector); }
}
#endregion
#region Implementation of IEndpointBehavior
/// <summary>
/// Implement to confirm that the endpoint meets some intended criteria.
/// </summary>
/// <param name="endpoint">The endpoint to validate.</param>
public void Validate(ServiceEndpoint endpoint)
{
}
/// <summary>
/// Implement to pass data at runtime to bindings to support custom behavior.
/// </summary>
/// <param name="endpoint">The endpoint to modify.</param><param name="bindingParameters">The objects that binding elements require to support the behavior.</param>
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
/// <summary>
/// Implements a modification or extension of the service across an endpoint.
/// </summary>
/// <param name="endpoint">The endpoint that exposes the contract.</param><param name="endpointDispatcher">The endpoint dispatcher to be modified or extended.</param>
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(this);
}
/// <summary>
/// Implements a modification or extension of the client across an endpoint.
/// </summary>
/// <param name="endpoint">The endpoint that is to be customized.</param><param name="clientRuntime">The client runtime to be customized.</param>
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
#endregion
#region Implementation of IDispatchMessageInspector
/// <summary>
/// Called after an inbound message has been received but before the message is dispatched to the intended operation.
/// </summary>
/// <returns>
/// The object used to correlate state. This object is passed back in the <see cref="M:System.ServiceModel.Dispatcher.IDispatchMessageInspector.BeforeSendReply(System.ServiceModel.Channels.Message@,System.Object)"/> method.
/// </returns>
/// <param name="request">The request message.</param><param name="channel">The incoming channel.</param><param name="instanceContext">The current service instance.</param>
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
CentralSessionDataContext.Current.RequestSession = CredentialHelper.GetSessionData(request);
return true;
}
/// <summary>
/// Called after the operation has returned but before the reply message is sent.
/// </summary>
/// <param name="reply">The reply message. This value is null if the operation is one way.</param><param name="correlationState">The correlation object returned from the <see cref="M:System.ServiceModel.Dispatcher.IDispatchMessageInspector.AfterReceiveRequest(System.ServiceModel.Channels.Message@,System.ServiceModel.IClientChannel,System.ServiceModel.InstanceContext)"/> method.</param>
public void BeforeSendReply(ref Message reply, object correlationState)
{
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
In my childhood, my uncle has shown me how to see the cloud in a close look and I understand that one can draw some elements of the Earth in the sky-canvas if he/she wants to. After that the cloud becomes closer to me and It teaches me one thing that, a deeper-look to something will give you some clues to draw your imagination. You can able to see that one which you have build-up in your mind.
Years past, I have started my career as a software engineer and has been looking for passion in my coding and development which I should be to enjoy my profession and has started asking myself- 'am I doing any engineering here?!' Is my code becoming that thing which I have designed in my mind? So to find that answer I have tried that old solution here... I have decided to come closer to my code and start analyzing them. And it is really working for me and at least it gives me the confidence that I can build something that I really want to. I can draw my thinking there through my code and can build-up my vision that I have designed in my mind. It also helps me to think out of the box, solve each problems by making blocks and make me careful on each steps.
• Morshed's Technical Blog site: http://morshedanwar.wordpress.com/
• Morshed's Technical articles those are published in Codeproject site: http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=2992452
• Morshed's Linkedin profile: http://www.linkedin.com/in/morshedanwar
• Morshed's Facebook Profile : http://www.facebook.com/morshed.pulok
Beside all these I like to do - photography and music. Here is my Flickr photos : http://www.flickr.com/photos/morshed_anwar/