<system.serviceModel> <bindings> <wsHttpBinding> <binding name="Logger_ILogReceiverServer"> <security mode="None"/> </binding> </wsHttpBinding> </bindings>
<client> <endpoint address="http://localhost:55021/Logger.svc" binding="wsHttpBinding" bindingConfiguration="Logger_ILogReceiverServer" contract="NLog.LogReceiverService.ILogReceiverClient" name="Logger_ILogReceiverServer"/> </client> </system.serviceModel><target xsi:type="LogReceiverService" name="RemoteWcfLogger" endpointConfigurationName="Logger_ILogReceiverServer" endpointAddress="http://localhost:55021/Logger.svc" useBinaryEncoding="True" clientId="TestApplication" includeEventProperties="True"></target>static void Main()
{
...
client.ClientCredentials.UserNamePassword.UserName = username;
client.ClientCredentials.UserNamePassword.Password = password;
...
}
I'll have to take a look at this, but I'm not an expert in WCF. Please let me know if you figure this out.
<system.serviceModel> <services> <service name="Your.Namespace.Path.To.Your.Service" behaviorConfiguration="SecureBehavior"> <endpoint binding="wsHttpBinding" bindingConfiguration="SecureBinding" contract="NLog.LogReceiverService.ILogReceiverServer"/> <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex"/> <host> <baseAddresses> <add baseAddress="https://your_secure_domain.com/servicePath"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="SecureBehavior"> <serviceDebug includeExceptionDetailInFaults="true"/> <serviceMetadata httpsGetEnabled="true"/> <serviceCredentials> <!--You must set your certificate configuration to make this example work--> <serviceCertificate findValue="0726d1969a5c8564e0636f9eec83f92e" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySerialNumber"/> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="AssamblyOf.YourCustom.UsernameValidator.UsernameValidator, AssamblyOf.YourCustom.UsernameValidator"/> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="SecureBinding" closeTimeout="00:00:20" openTimeout="00:00:20" receiveTimeout="00:00:20" sendTimeout="00:00:20"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName"/> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding> </bindings> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>public class UsernameValidator : UserNamePasswordValidator{ private const string UserName = "your_username_here"; private const string Password = "your_password_here";
public override void Validate(string userName, string password) { // validate arguments if (string.IsNullOrEmpty(userName)) throw new ArgumentNullException("userName"); if (string.IsNullOrEmpty(password)) throw new ArgumentNullException("password");
// // Nombre de usuario y contraseñas hardcodeados por seguridad // if (!userName.Equals(UserName) || !password.Equals(Password)) throw new SecurityTokenException("Nombre de usuario o contraseña no válidos para consumir este servicio"); }}// we assume that this class is created in NLog.CustomExtendedService namespace
[Target("LogReceiverSecureService")]public class LogReceiverSecureService : NLog.Targets.LogReceiverWebServiceTarget{ /// <summary> /// Gets or sets the UserName of the service when it's authentication is set to UserName /// </summary> /// <value>The name of the endpoint configuration.</value> public string ServiceUsername { get; set; }
/// <summary> /// Gets or sets de Password of the service when it's authentication is set to UserName /// </summary> public string ServicePassword { get; set; }
/// <summary> /// Creates a new instance of WcfLogReceiverClient. /// /// We make override over this method to allow the authentication /// </summary> /// <returns></returns> protected override NLog.LogReceiverService.WcfLogReceiverClient CreateWcfLogReceiverClient() { var client = base.CreateWcfLogReceiverClient(); if (client.ClientCredentials != null) { // // You could use the config file configuration (this example) or you could hard-code it (if you do not want to expose the credentials) // client.ClientCredentials.UserName.UserName = this.ServiceUsername; client.ClientCredentials.UserName.Password = this.ServicePassword; } return client; }}<system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ILogReceiverServer"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" /> <transport clientCredentialType="None" /> </security> </binding> </wsHttpBinding> </bindings>
<client> <endpoint address="https://your_secure_domain.com/servicePath/Logger.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ILogReceiverServer" contract="NLog.LogReceiverService.ILogReceiverClient" name="WSHttpBinding_ILogReceiverServer" /> </client>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel> <extensions> <add assembly="NLog.CustomExtendedService" /> <!--Assuming the custom Target was added to this assambly --> </extensions>
<targets> <target xsi:type="LogReceiverSecureService" name="RemoteWcfLogger" endpointConfigurationName="WSHttpBinding_ILogReceiverServer" endpointAddress="https://your_secure_domain.com/servicePath/Logger.svc" ServiceUsername="your_username_here" ServicePassword="your_password_here" useBinaryEncoding="True" clientId="YourApplicationNameOrId" includeEventProperties="True"> </target> </targets>Glad you figured it out, and thanks for the example.