1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Dispatcher
{
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Xml;
using System.Security;
using System.Security.Permissions;
using System.ServiceModel.MsmqIntegration;
using System.Runtime;
class PartialTrustValidationBehavior : IServiceBehavior, IEndpointBehavior
{
static PartialTrustValidationBehavior instance = null;
internal static PartialTrustValidationBehavior Instance
{
get
{
// no need to synchronize -- it's ok if two are created
if (instance == null)
{
instance = new PartialTrustValidationBehavior();
}
return instance;
}
}
void ValidateEndpoint(ServiceEndpoint endpoint)
{
Binding binding = endpoint.Binding;
if (binding != null)
{
new BindingValidator(endpoint.Binding).Validate();
}
}
#region IEndpointBehavior Members
void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
{
if (endpoint == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpoint");
ValidateEndpoint(endpoint);
}
void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }
void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { }
void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { }
#endregion
#region IServiceBehavior Members
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
if (description == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("description");
for (int i = 0; i < description.Endpoints.Count; i++)
{
ServiceEndpoint endpoint = description.Endpoints[i];
if (endpoint != null)
{
ValidateEndpoint(endpoint);
}
}
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
#endregion
struct BindingValidator
{
static Type[] unsupportedBindings = new Type[]
{
typeof(NetNamedPipeBinding),
typeof(WSDualHttpBinding),
typeof(WS2007FederationHttpBinding),
typeof(WSFederationHttpBinding),
typeof(NetMsmqBinding),
#pragma warning disable 0618
typeof(NetPeerTcpBinding),
#pragma warning restore 0618
typeof(MsmqIntegrationBinding),
};
static Type[] unsupportedBindingElements = new Type[]
{
typeof(AsymmetricSecurityBindingElement),
typeof(CompositeDuplexBindingElement),
typeof(MsmqTransportBindingElement),
typeof(NamedPipeTransportBindingElement),
typeof(OneWayBindingElement),
#pragma warning disable 0618
typeof(PeerCustomResolverBindingElement),
typeof(PeerTransportBindingElement),
typeof(PnrpPeerResolverBindingElement),
#pragma warning restore 0618
typeof(ReliableSessionBindingElement),
typeof(SymmetricSecurityBindingElement),
typeof(TransportSecurityBindingElement),
typeof(MtomMessageEncodingBindingElement),
};
Binding binding;
internal BindingValidator(Binding binding)
{
this.binding = binding;
}
internal void Validate()
{
Fx.Assert(binding != null, "BindingValidator was not constructed with a valid Binding instance");
Type bindingType = binding.GetType();
if (IsUnsupportedBindingType(bindingType))
{
UnsupportedSecurityCheck(SR.FullTrustOnlyBindingSecurityCheck1, bindingType);
}
// special-case error message for WSHttpBindings
bool isWSHttpBinding = typeof(WSHttpBinding).IsAssignableFrom(bindingType);
string sr = isWSHttpBinding ? SR.FullTrustOnlyBindingElementSecurityCheckWSHttpBinding1 : SR.FullTrustOnlyBindingElementSecurityCheck1;
BindingElementCollection elements = binding.CreateBindingElements();
foreach (BindingElement element in elements)
{
Type bindingElementType = element.GetType();
if (element != null && IsUnsupportedBindingElementType(bindingElementType))
{
UnsupportedSecurityCheck(sr, bindingElementType);
}
}
}
bool IsUnsupportedBindingType(Type bindingType)
{
for (int i = 0; i < unsupportedBindings.Length; i++)
{
if (unsupportedBindings[i] == bindingType)
return true;
}
return false;
}
bool IsUnsupportedBindingElementType(Type bindingElementType)
{
for (int i = 0; i < unsupportedBindingElements.Length; i++)
{
if (unsupportedBindingElements[i] == bindingElementType)
return true;
}
return false;
}
static readonly PermissionSet fullTrust = new PermissionSet(PermissionState.Unrestricted);
void UnsupportedSecurityCheck(string resource, Type type)
{
try
{
fullTrust.Demand();
}
catch (SecurityException)
{
throw new InvalidOperationException(SR.GetString(resource, binding.Name, type));
}
}
}
}
}
|