1 //------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //------------------------------------------------------------
4 namespace System.ServiceModel
5 {
6     using System.Runtime;
7     using System.ServiceModel.Channels;
8     using System.ComponentModel;
9 
10     public sealed class WSFederationHttpSecurity
11     {
12         internal const WSFederationHttpSecurityMode DefaultMode = WSFederationHttpSecurityMode.Message;
13 
14         WSFederationHttpSecurityMode mode;
15         FederatedMessageSecurityOverHttp messageSecurity;
16 
WSFederationHttpSecurity()17         public WSFederationHttpSecurity()
18             : this(DefaultMode, new FederatedMessageSecurityOverHttp())
19         {
20         }
21 
WSFederationHttpSecurity(WSFederationHttpSecurityMode mode, FederatedMessageSecurityOverHttp messageSecurity)22         WSFederationHttpSecurity(WSFederationHttpSecurityMode mode, FederatedMessageSecurityOverHttp messageSecurity)
23         {
24             Fx.Assert(WSFederationHttpSecurityModeHelper.IsDefined(mode), string.Format("Invalid WSFederationHttpSecurityMode value: {0}", mode.ToString()));
25 
26             this.mode = mode;
27             this.messageSecurity = messageSecurity == null ? new FederatedMessageSecurityOverHttp() : messageSecurity;
28         }
29 
30         public WSFederationHttpSecurityMode Mode
31         {
32             get { return this.mode; }
33             set
34             {
35                 if (!WSFederationHttpSecurityModeHelper.IsDefined(value))
36                 {
37                     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value"));
38                 }
39                 this.mode = value;
40             }
41         }
42 
43         public FederatedMessageSecurityOverHttp Message
44         {
45             get { return this.messageSecurity; }
46             set { this.messageSecurity = value; }
47         }
48 
CreateMessageSecurity(bool isReliableSessionEnabled, MessageSecurityVersion version)49         internal SecurityBindingElement CreateMessageSecurity(bool isReliableSessionEnabled, MessageSecurityVersion version)
50         {
51             if (this.mode == WSFederationHttpSecurityMode.Message || this.mode == WSFederationHttpSecurityMode.TransportWithMessageCredential)
52             {
53                 return this.messageSecurity.CreateSecurityBindingElement(this.Mode == WSFederationHttpSecurityMode.TransportWithMessageCredential, isReliableSessionEnabled, version);
54             }
55             else
56             {
57                 return null;
58             }
59         }
60 
TryCreate(SecurityBindingElement sbe, WSFederationHttpSecurityMode mode, HttpTransportSecurity transportSecurity, bool isReliableSessionEnabled, MessageSecurityVersion version, out WSFederationHttpSecurity security)61         internal static bool TryCreate(SecurityBindingElement sbe,
62                                        WSFederationHttpSecurityMode mode,
63                                        HttpTransportSecurity transportSecurity,
64                                        bool isReliableSessionEnabled,
65                                        MessageSecurityVersion version,
66                                        out WSFederationHttpSecurity security)
67         {
68             security = null;
69             FederatedMessageSecurityOverHttp messageSecurity = null;
70             if (sbe == null)
71             {
72                 mode = WSFederationHttpSecurityMode.None;
73             }
74             else
75             {
76                 mode &= WSFederationHttpSecurityMode.Message | WSFederationHttpSecurityMode.TransportWithMessageCredential;
77                 Fx.Assert(WSFederationHttpSecurityModeHelper.IsDefined(mode), string.Format("Invalid WSFederationHttpSecurityMode value: {0}", mode.ToString()));
78 
79                 if (!FederatedMessageSecurityOverHttp.TryCreate(sbe, mode == WSFederationHttpSecurityMode.TransportWithMessageCredential, isReliableSessionEnabled, version, out messageSecurity))
80                     return false;
81             }
82             security = new WSFederationHttpSecurity(mode, messageSecurity);
83             return true;
84         }
85 
InternalShouldSerialize()86         internal bool InternalShouldSerialize()
87         {
88             return this.ShouldSerializeMode()
89                 || this.ShouldSerializeMessage();
90         }
91 
92         [EditorBrowsable(EditorBrowsableState.Never)]
ShouldSerializeMode()93         public bool ShouldSerializeMode()
94         {
95             return this.Mode != DefaultMode;
96         }
97 
98         [EditorBrowsable(EditorBrowsableState.Never)]
ShouldSerializeMessage()99         public bool ShouldSerializeMessage()
100         {
101             return this.Message.InternalShouldSerialize();
102         }
103     }
104 }
105