Managing AWS Credentials for .NET Developers
When developing .NET apps that use AWS, it’s helpful to know that there are a number of ways to store credentials. These can be used for AWS SDK for .NET calls in your app, or AWS CLI calls on the console. Of course these principles apply to other platforms as well. I’m going to assume that you have everything you need installed, including the AWS CLI.
An aside: In my work as a consultant, I’ve found the need to switch frequently between different sets of credentials. I’ve integrated some of the following methods into a .NET based credential management tool, located on github. This way I can switch my default credential quicky, determine which IAM account corresponds to a credential, and more. Naturally all the source code is out there. Let me know if you find it useful.
There are 4 distinct ways to do this. Some apply to your .NET code only (including Powershell scripts), and others apply only to the AWS CLI.
1. App.config file (see cautionary note)
Applies to: .NET code only
If you’re developing in .NET, you can simply add your Access Key and Secret Key in CLEAR TEXT to your program’s app.config file.
<add key="AWSAccessKey" value="EYNAEYNAEYNAEYNA"/> <add key="AWSSecretKey" value="uAWguAWguAWguAWguAWguAWguAWg"/>
Cautionary note: There are circumstances where it’s appropriate to use this method, but be aware that you’re storing your credentials unencrypted. If you should accidentally check your config file into github, your account will be hacked in a matter of minutes. So please be careful.
2. System Properties
Applies to: .NET code and CLI
Another one-credential option is to store credentials in your user settings.
C:\Users\Michael> set AWS_ACCESS_KEY_ID=ABCDEABCDEABCDEABCDE C:\Users\Michael> set AWS_SECRET_ACCESS_KEY=P08LdGmn9Q/8JT5A9wwCP08LdGmn9Q/8JT5A9wwC C:\Users\Michael> set AWS_DEFAULT_REGION=us-east-1
IMO this is not preferable – I want to keep clear text credentials out of my settings.
3A. AWS Configure – One set of credentials
Applies to: .NET code and CLI
Use the aws configure command set or editing the credential file it uses to store information, you can manage and use multiple credential sets.
This works well if you have only one set of credentials to deal with, or just want to go with the simplest scenario.
C:\Users\Michael> aws configure AWS Access Key ID [None]: ABCDEABCDEABCDEABCDE AWS Secret Access Key [None]: P08LdGmn9Q/8JT5A9wwCP08LdGmn9Q/8JT5A9wwC Default region name [None]: us-east-1 Default output format [None]: json
3B. AWS Configure – Multiple sets of credentials
Applies to: CLI only
Credentials stored using aws configure are stored a file in your user directory (%USERPROFILE%\.aws\credentials or ~/.aws/credentials). The credential file can store multiple sets, which appear in the file as “named” sections. To manage this, you can either use the aws configure –profile switch, or edit the file directly. Type aws configure help to see what else you can do with this. Note: default is set per the example above.
[default] aws_access_key_id = ASDFASDFASDFASDFASDF aws_secret_access_key = P08LdGmn9Q/8JT5A9wwCP08LdGmn9Q/8JT5A9wwC [client-one] aws_access_key_id = ABCDEABCDEABCDEABCDE aws_secret_access_key = P08LdGmn9Q/8JT5A9wwCP08LdGmn9Q/8JT5A9wwC [client-two] aws_access_key_id = FGHIJFGHIJFGHIJFGHIJ aws_secret_access_key = P08LdGmn9Q/8JT5A9wwCP08LdGmn9Q/8JT5A9wwC
NOTE: The best way to delete all of your credentials is to delete the file.
Using a stored profile
Applies to: CLI only
Now that you have aws configure profiles set up, you can tell AWS which one to use, while you’re logged in. Just the appropriate profile using the following command.
set AWS_DEFAULT_PROFILE=client-one
You can also specify the profile in the command. For example, to list all s3 buckets:
aws s3 ls --profile=client-one
4. API-Stored Credentials (for SDK use)
Applies to: .NET code only
The AWSSDK .NET has class Amazon.Util.ProfileManager which can store a named list of credentials. This gives programs like Cloudberry Explorer, and the AWS Visual Studio add-in a common place from which can save and retrieve credentials.
For an example of how to set these, use the c# code that I posted or look at the powershell script included with the AWS SDK for .NET.
These credentials are also stored in a file, which you’ll find at %LOCALAPPDATA%/AWSToolkit/RegisteredAccounts.json. This is similar to the way aws configure stores credentials, but this time they are encrypted!
Note: If one of your credential sets is called “default”, that will be used (and takes precedence over credentials set by AWS Configure).
Using a specific profile in your code
One handy feature is that if you have API stored credentials set, you can specify the default profile to use in the app.config or web.config file of your .NET application. The following configuration is an example:
<configuration> <appSettings> <add key="AWSProfileName" value="client-one"/> </appSettings> </configuration>
References:
One comment