Benutzer:MovGP0/Basic HTTP Auth
Zur Navigation springen
Zur Suche springen
MovGP0 | Über mich | Hilfen | Artikel | Weblinks | Literatur | Zitate | Notizen | Programmierung | MSCert | Physik |
Basic HTTP Auth[Bearbeiten | Quelltext bearbeiten]Classes[Bearbeiten | Quelltext bearbeiten]Client Credentials[Bearbeiten | Quelltext bearbeiten]/// <summary>
/// http://stackoverflow.com/questions/3725294/set-wcf-clientcredentials-in-app-config
/// </summary>
public class UserNameClientCredentials : ClientCredentialsElement
{
private ConfigurationPropertyCollection _properties;
public override Type BehaviorType
{
get { return typeof(ClientCredentials); }
}
/// <summary>
/// Username (required)
/// </summary>
public string UserName
{
get { return (string)base["userName"]; }
set { base["userName"] = value; }
}
/// <summary>
/// Password (optional)
/// </summary>
public string Password
{
get { return (string)base["password"]; }
set { base["password"] = value; }
}
protected override ConfigurationPropertyCollection Properties
{
get
{
if (_properties == null)
{
var baseProps = base.Properties;
baseProps.Add(new ConfigurationProperty("userName", typeof(String), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired));
baseProps.Add(new ConfigurationProperty("password", typeof(String), String.Empty));
_properties = baseProps;
}
return _properties;
}
}
protected override object CreateBehavior()
{
var creds = (ClientCredentials)base.CreateBehavior();
Debug.Assert(creds != null, "creds != null");
creds.UserName.UserName = UserName;
if (Password != null)
creds.UserName.Password = Password;
ApplyConfiguration(creds);
return creds;
}
}
Message Inspector[Bearbeiten | Quelltext bearbeiten]/// <summary>
/// http://msmvps.com/blogs/paulomorgado/archive/2007/04/27/wcf-building-an-http-user-agent-message-inspector.aspx
/// </summary>
public class BasicHttpAuthClientMessageInspector : IClientMessageInspector
{
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var creds = channel.Extensions.Find<UserNameClientCredentials>();
if (creds != null)
{
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[HttpRequestHeader.Authorization] = new BasicAuthHelper(creds.UserName, creds.Password).AuthHeader;
request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty);
}
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
}
Endpoint Behaviour[Bearbeiten | Quelltext bearbeiten]/// <summary>
/// http://stackoverflow.com/questions/6309367/how-do-you-configure-a-messageinspector-when-using-standardendpoints-in-wcf-rest
/// </summary>
public class BasicHttpAuthEndpointBehavior : IEndpointBehavior
{
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(new BasicHttpAuthClientMessageInspector());
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Configuration Section[Bearbeiten | Quelltext bearbeiten]public class BasicHttpAuthConfigurationSection : BehaviorExtensionElement, IServiceBehavior
{
protected override object CreateBehavior()
{
return new BasicHttpAuthEndpointBehavior();
}
public override Type BehaviorType
{
get { return typeof (BasicHttpAuthEndpointBehavior); }
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
Web.config[Bearbeiten | Quelltext bearbeiten]Behavior Extensions[Bearbeiten | Quelltext bearbeiten]<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="userNameClientCredentials" type="MyNamespace.UserNameClientCredentials, MyDllName, Version=1.0.0.0, Culture=neutral" />
<add name="basicHttpAuth" type="MyNamespace.BasicHttpAuthConfigurationSection, MyDllName, Version=1.0.0.0, Culture=neutral" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
Endpoint[Bearbeiten | Quelltext bearbeiten]<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="MyServiceEndpoint">
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="Basic" />
</security>
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Behavior[Bearbeiten | Quelltext bearbeiten]<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="MyServiceBehavior">
<userNameClientCredentials userName="********" password="********"> <!-- custom -->
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck" />
</serviceCertificate>
</userNameClientCredentials>
<dispatcherSynchronization asynchronousSendEnabled="true" maxPendingReceives="10" />
<basicHttpAuth /> <!-- custom -->
</behavior>
</behaviors>
</system.serviceModel>
Binding[Bearbeiten | Quelltext bearbeiten]<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MyServiceBinding"
maxBufferPoolSize="41943040"
maxBufferSize="5242880"
maxReceivedMessageSize="5242880">
<security mode="Transport">
<transport clientCredentialType="Basic" proxyCredentialType="Basic" />
</security>
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
Client Configuration[Bearbeiten | Quelltext bearbeiten]<system.serviceModel>
<client>
<endpoint address="https://localhost:7777/MyService"
behaviorConfiguration="MyServiceBehavior"
binding="basicHttpBinding"
bindingConfiguration="MyServiceBinding"
contract="Namespace.MyContractClass"
name="kabelplusOnlineServicesPort" />
</client>
</system.serviceModel>
|