To pass the service credentials in the code it is easy:
myServiceClient.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("myUsername", "myPassword", "myDomain");But to put those credentials into the web.config it is a bit more complex.
- Create this class:
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.ServiceModel.Configuration; using System.ServiceModel.Description; using System.Text; namespace MyNamespace { public class UserNameClientCredentialsElement : 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) { ConfigurationPropertyCollection baseProps = base.Properties; baseProps.Add(new ConfigurationProperty( "userName", typeof(String), null, null, new StringValidator(1), ConfigurationPropertyOptions.IsRequired)); baseProps.Add(new ConfigurationProperty( "password", typeof(String), "")); properties = baseProps; } return properties; } } protected override object CreateBehavior() { var creds = (ClientCredentials)base.CreateBehavior(); if(creds != null) creds.Windows.ClientCredential = new NetworkCredential(UserName, Password); return creds; } } }
- Register the behaviorExtension
- Use your new extension
<system.serviceModel> <client><!--(3)--> <endpoint ...YourEndpointConfig... behaviorConfiguration="UserNamePasswordBehavior" /> </client> <behaviors><!--(2)--> <endpointBehaviors> <behavior name="UserNamePasswordBehavior"> <userNameClientCredentials userName="skroob" password="12345" /> <!--Visual Studio will give you warning squiggly on <userNameClientCredentials> saying that "The element 'behavior' has invalid child element" but will work at runtime.--> </behavior> </endpointBehaviors> </behaviors> <extensions><!--(1)--> <behaviorExtensions> <add name="userNameClientCredentials" type="MyNamespace.UserNameClientCredentialsElement, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> ... </system.serviceModel>Thanks a lot to Patrick Paquet to post this answer on this topic
No comments:
Post a Comment