2009-05-13 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Dispatcher / SecurityHandler.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.ServiceModel.Channels;\r
5 using System.ServiceModel;\r
6 using System.ServiceModel.Security.Tokens;\r
7 \r
8 namespace System.ServiceModel.Dispatcher\r
9 {\r
10         internal class SecurityHandler : BaseRequestProcessorHandler\r
11         {\r
12                 protected override bool ProcessRequest (MessageProcessingContext mrc)\r
13                 {\r
14                         DispatchRuntime dispatch_runtime = mrc.OperationContext.EndpointDispatcher.DispatchRuntime;\r
15                         Message negoResponce = null;\r
16                         // process WS-Trust based negotiation\r
17                         MessageSecurityBindingSupport support =\r
18                                 dispatch_runtime.ChannelDispatcher.Listener.GetProperty<MessageSecurityBindingSupport> ();\r
19                         if (support != null && mrc.IncomingMessage.Headers.FindHeader ("Security", Constants.WssNamespace) < 0) {\r
20                                 CommunicationSecurityTokenAuthenticator nego =\r
21                                         support.TokenAuthenticator as CommunicationSecurityTokenAuthenticator;\r
22                                 if (nego != null)\r
23                                         negoResponce = nego.Communication.ProcessNegotiation (mrc.IncomingMessage);\r
24                         }\r
25 \r
26                         if (negoResponce == null)\r
27                                 return false;\r
28                         \r
29                         ReplyNegoResponse (mrc, negoResponce);\r
30                         return true;\r
31 \r
32                 }\r
33 \r
34                 void ReplyNegoResponse (MessageProcessingContext mrc, Message negoResponse)\r
35                 {\r
36                         negoResponse.Headers.CopyHeadersFrom (mrc.OperationContext.OutgoingMessageHeaders);\r
37                         negoResponse.Properties.CopyProperties (mrc.OperationContext.OutgoingMessageProperties);                        \r
38                         mrc.RequestContext.Reply (negoResponse, mrc.Operation.Parent.ChannelDispatcher.timeouts.SendTimeout);\r
39                         return;\r
40                 }\r
41         }\r
42 }\r