Differences

This shows you the differences between the selected revisions of the page.

2015-11-03 2015-11-04
securepassword (martin) c#/vb.net (martin)
Line 83: Line 83:
<code powershell> <code powershell>
$sessionOptions.SecurePassword = ConvertTo-SecureString $config.Configuration.Password $sessionOptions.SecurePassword = ConvertTo-SecureString $config.Configuration.Password
 +</code>
 +
 +==== Visual Studio (C#, VB.NET) ====
 +
 +In .NET projects (C#, VB.NET) an application configuration file (''App.config'') is used to store the settings. Though this file contains other configuration that needs to be shared and/or stored in a revision control system. To separate the credentials from other settings, you can link another configuration file like shown below.
 +
 +Use the ''file'' attribute of ''appSettings'' element in the primary application configuration file (''App.config''):
 +
 +<code xml>
 +<?xml version="1.0" encoding="utf-8" ?>
 +<configuration>
 +  <startup>
 +    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
 +  </startup>
 +  <appSettings file="ProtectedConfig.config">
 +    <!-- other settings -->
 +  </appSettings>
 +</configuration>
 +</code>
 +
 +Add a new %%XML%% file to the project and name it ''ProtectedConfig.config'':
 +
 +<code xml>
 +<?xml version="1.0" encoding="utf-8" ?>
 +<appSettings>
 +  <add key="UserName" value="martin" />
 +  <add key="Password" value="test" />
 +</appSettings>
 +</code>
 +
 +Set the //Copy to Output Directory// property of the file to //Copy if newer// and the //Build Action// to //Content// to have the new configuration file correctly deployed.
 +
 +To read the settings from the configuration file use ''[[https://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx|ConfigurationManager.AppSettings]]'':((You need to reference the ''System.configuration'' assembly in your project to use the ''ConfigurationManager'' class.))
 +
 +<code csharp>
 +SessionOptions sessionOptions = new SessionOptions
 +{
 +    Protocol = Protocol.Sftp,
 +    HostName = "example.com",
 +    UserName = ConfigurationManager.AppSettings["UserName"],
 +    Password = ConfigurationManager.AppSettings["Password"],
 +};
 +</code>
 +
 +You can also leverage Windows Data Protection API to encrypt the password in the XML file.
 +
 +To encrypt the password use PowerShell ''ConvertFrom-SecureString'' cmdlet:
 +
 +<code>
 +powershell.exe -Command "& Read-Host -AsSecureString | ConvertFrom-SecureString"
 +</code>
 +
 +A password encrypted this way can be decrypted by the same Windows account only.
 +
 +Store the encrypted password to the %%XML%% file instead of the plain-text one:
 +
 +<code xml>
 +<?xml version="1.0" encoding="utf-8" ?>
 +<appSettings>
 +  <add key="UserName" value="martin" />
 +  <add key="Password" value="01000000d08c9ddf0115d1118c7a00c04fc297eb01000000cf6dbc52515..." />
 +</appSettings>
 +</code>
 +
 +To decrypt the password, use ''[[https://msdn.microsoft.com/en-us/library/xh68ketz.aspx|ProtectedData.Unprotect]]'':((You need to reference the ''System.Security'' assembly in your project to use the ''ProtectedData'' class.))
 +
 +<code csharp>
 +string hex = ConfigurationManager.AppSettings["Password"];
 +byte[] bytes = Enumerable.Range(0, hex.Length / 2).Select(x => Convert.ToByte(hex.Substring(x * 2, 2), 16)).ToArray();
 +byte[] decrypted = ProtectedData.Unprotect(bytes, null, DataProtectionScope.CurrentUser);
 +sessionOptions.Password = Encoding.Unicode.GetString(decrypted);
</code> </code>

Last modified: by martin