Linux 上的 AWS .NET SDK
AWS .NET SDK on Linux
我目前正在将第三方提出的 ASP.NET 申请从 Windows 转移到 Linux。我阅读了文档,没有任何迹象表明这应该是个问题,但遗憾的是
var profile = new CredentialProfile(profileName, credentials) {
Region = RegionEndpoint.EUWest1
};
var netSDKFile = new NetSDKCredentialsFile();
netSDKFile.RegisterProfile(profile);
抛出以下异常
Unhandled Exception: Amazon.Runtime.AmazonClientException: The encrypted store is not available. This may be due to use of a non-Windows operating system or Windows Nano Server, or the current user account may not have its profile loaded.
at Amazon.Util.Internal.SettingsManager.EnsureAvailable()
at Amazon.Runtime.CredentialManagement.NetSDKCredentialsFile..ctor()
Linux 不支持 Amazon .NET SDK(或其一部分)吗?如果是这种情况,是否有可能的解决方法?
大多数 Linux 不支持但 Windows 支持的部分很少。除了 NetSDKCredentialsFile
之外我想不出任何其他东西,这是因为它使用 Win32 API 来加密凭据。
您可以使用 SharedCredentialsFile
在存储在 ~/.aws/credentials
下的凭据文件中注册配置文件。这与所有其他 AWS SDK 和工具支持的存储凭证相同。
根据 Norm 的回答,我找到了解释如何使用共享凭证的资源:https://medium.com/@somchat/programming-using-aws-net-sdk-9ce3f5119633
这就是我之前使用 NetSDKCredentials 的方式,它不适用于 Linux/Mac OS:
//Try this code on a non-Windows platform and you will see the above error
var options = new CredentialProfileOptions
{
AccessKey = "access_key",
SecretKey = "secret_key"
};
var profile = new CredentialProfile("default", options);
profile.Region = RegionEndpoint.USWest1;
NetSDKCredentialsFile file = new NetSDKCredentialsFile();
file.RegisterProfile(profile);
但我随后能够使用此示例来使用 SharedCredentials:
var credProfileStoreChain = new CredentialProfileStoreChain();
if (credProfileStoreChain.TryGetAWSCredentials("default", out AWSCredentials awsCredentials))
{
Console.WriteLine("Access Key: " + awsCredentials.GetCredentials().AccessKey);
Console.WriteLine("Secret Key: " + awsCredentials.GetCredentials().SecretKey);
}
Console.WriteLine("Hello World!");
然后您将能够看到您的代码能够访问密钥:
Access Key: A..................Q
Secret Key: 8.......................................p
Hello World!
然后我使用 System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()(因为我在 Windows 和 Linux 上都使用此代码)来确定要使用的凭据:
using System.Runtime.InteropServices;
//NETSDK Credentials only work on Windows - must use SharedCredentials on Linux
bool isLinux = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
if (isLinux) {
//Use SharedCredentials
} else {
//Use NetSDKCredentials
}
您可能会发现 AWS 文档的这一部分也很有帮助:https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#creds-locate
我目前正在将第三方提出的 ASP.NET 申请从 Windows 转移到 Linux。我阅读了文档,没有任何迹象表明这应该是个问题,但遗憾的是
var profile = new CredentialProfile(profileName, credentials) {
Region = RegionEndpoint.EUWest1
};
var netSDKFile = new NetSDKCredentialsFile();
netSDKFile.RegisterProfile(profile);
抛出以下异常
Unhandled Exception: Amazon.Runtime.AmazonClientException: The encrypted store is not available. This may be due to use of a non-Windows operating system or Windows Nano Server, or the current user account may not have its profile loaded.
at Amazon.Util.Internal.SettingsManager.EnsureAvailable()
at Amazon.Runtime.CredentialManagement.NetSDKCredentialsFile..ctor()
Linux 不支持 Amazon .NET SDK(或其一部分)吗?如果是这种情况,是否有可能的解决方法?
大多数 Linux 不支持但 Windows 支持的部分很少。除了 NetSDKCredentialsFile
之外我想不出任何其他东西,这是因为它使用 Win32 API 来加密凭据。
您可以使用 SharedCredentialsFile
在存储在 ~/.aws/credentials
下的凭据文件中注册配置文件。这与所有其他 AWS SDK 和工具支持的存储凭证相同。
根据 Norm 的回答,我找到了解释如何使用共享凭证的资源:https://medium.com/@somchat/programming-using-aws-net-sdk-9ce3f5119633
这就是我之前使用 NetSDKCredentials 的方式,它不适用于 Linux/Mac OS:
//Try this code on a non-Windows platform and you will see the above error
var options = new CredentialProfileOptions
{
AccessKey = "access_key",
SecretKey = "secret_key"
};
var profile = new CredentialProfile("default", options);
profile.Region = RegionEndpoint.USWest1;
NetSDKCredentialsFile file = new NetSDKCredentialsFile();
file.RegisterProfile(profile);
但我随后能够使用此示例来使用 SharedCredentials:
var credProfileStoreChain = new CredentialProfileStoreChain();
if (credProfileStoreChain.TryGetAWSCredentials("default", out AWSCredentials awsCredentials))
{
Console.WriteLine("Access Key: " + awsCredentials.GetCredentials().AccessKey);
Console.WriteLine("Secret Key: " + awsCredentials.GetCredentials().SecretKey);
}
Console.WriteLine("Hello World!");
然后您将能够看到您的代码能够访问密钥:
Access Key: A..................Q
Secret Key: 8.......................................p
Hello World!
然后我使用 System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()(因为我在 Windows 和 Linux 上都使用此代码)来确定要使用的凭据:
using System.Runtime.InteropServices;
//NETSDK Credentials only work on Windows - must use SharedCredentials on Linux
bool isLinux = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
if (isLinux) {
//Use SharedCredentials
} else {
//Use NetSDKCredentials
}
您可能会发现 AWS 文档的这一部分也很有帮助:https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#creds-locate