Merge branch 'master' of github.com:tgiphil/mono
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel / WSFederationHttpBinding.cs
1 //
2 // WSFederationHttpBinding.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.com
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 using System;
29 using System.Collections.Generic;
30 using System.Net.Security;
31 using System.ServiceModel.Channels;
32 using System.ServiceModel.Description;
33 using System.ServiceModel.Security;
34 using System.ServiceModel.Security.Tokens;
35
36 namespace System.ServiceModel
37 {
38         public class WSFederationHttpBinding : WSHttpBindingBase
39         {
40                 WSFederationHttpSecurity security;
41                 bool allow_cookies;
42
43                 public WSFederationHttpBinding ()
44                         : this (WSFederationHttpSecurityMode.Message)
45                 {
46                 }
47
48                 public WSFederationHttpBinding (
49                         WSFederationHttpSecurityMode securityMode)
50                         : this (securityMode, true)
51                 {
52                 }
53
54                 public WSFederationHttpBinding (
55                         WSFederationHttpSecurityMode securityMode,
56                         bool reliableSessionEnabled)
57                 {
58                         security = new WSFederationHttpSecurity (securityMode);
59                 }
60
61                 [MonoTODO]
62                 public WSFederationHttpBinding (string configurationName)
63                 {
64                         throw new NotImplementedException ();
65                 }
66
67                 [MonoTODO]
68                 public bool AllowCookies {
69                         get { return allow_cookies; }
70                         set { allow_cookies = value; }
71                 }
72
73                 [MonoTODO]
74                 public WSFederationHttpSecurity Security {
75                         get { return security; }
76                 }
77
78                 [MonoTODO]
79                 public override BindingElementCollection CreateBindingElements ()
80                 {
81                         return base.CreateBindingElements ();
82                 }
83
84                 [MonoTODO]
85                 protected override SecurityBindingElement CreateMessageSecurity ()
86                 {
87                         SymmetricSecurityBindingElement element =
88                                 new SymmetricSecurityBindingElement ();
89
90                         element.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
91
92 //                      if (!Security.Message.EstablishSecurityContext)
93 //                              element.SetKeyDerivation (false);
94
95                         IssuedSecurityTokenParameters istp =
96                                 new IssuedSecurityTokenParameters ();
97                         // FIXME: issuer binding must be secure.
98                         istp.IssuerBinding = new CustomBinding (
99                                 new TextMessageEncodingBindingElement (),
100                                 GetTransport ());
101                         element.EndpointSupportingTokenParameters.Endorsing.Add (istp);
102
103                         if (Security.Message.NegotiateServiceCredential) {
104                                 element.ProtectionTokenParameters =
105                                         // FIXME: fill proper parameters
106                                         new SslSecurityTokenParameters (false, true);
107                         } else {
108                                 element.ProtectionTokenParameters =
109                                         new X509SecurityTokenParameters ();
110                         }
111
112 //                      if (!Security.Message.EstablishSecurityContext)
113 //                              return element;
114
115                         // SecureConversation enabled
116
117                         ChannelProtectionRequirements reqs =
118                                 new ChannelProtectionRequirements ();
119                         // FIXME: fill the reqs
120
121                         // FIXME: for TransportWithMessageCredential mode,
122                         // return TransportSecurityBindingElement.
123
124                         return SecurityBindingElement.CreateSecureConversationBindingElement (
125                                 // FIXME: requireCancellation
126                                 element, true, reqs);
127                 }
128
129                 [MonoTODO]
130                 protected override TransportBindingElement GetTransport ()
131                 {
132                         switch (Security.Mode) {
133                         case WSFederationHttpSecurityMode.TransportWithMessageCredential:
134                                 return new HttpsTransportBindingElement ();
135                         default:
136                                 return new HttpTransportBindingElement ();
137                         }
138                 }
139         }
140 }