如何让dotnet restore使用nuget.config凭证访问AWS CodeArtifact?
解决方案:仅通过nuget.config存储凭证访问AWS CodeArtifact
AWS CodeArtifact的NuGet认证机制和GitHub Packages不同,不能直接将IAM Access Key/Secret Key写入nuget.config,但可以通过生成临时授权令牌的方式,将令牌存入nuget.config实现访问,具体步骤如下:
1. 生成AWS CodeArtifact授权令牌
使用AWS CLI执行以下命令生成有效期内的授权令牌(最长可设为12小时,示例设为15分钟):
aws codeartifact get-authorization-token --domain 你的域名 --domain-owner 你的AWS账户ID --region 你的区域(如eu-north-1) --duration-seconds 900
执行后会返回一个authorizationToken值,这就是我们需要的凭证。
2. 修改nuget.config配置
将nuget.config中的packageSourceCredentials部分修改为:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="codeartifact" value="https://{stuff}.codeartifact.eu-north-1.amazonaws.com/nuget/{stuff}/v3/index.json" /> </packageSources> <packageSourceCredentials> <codeartifact> <add key="Username" value="aws" /> <!-- 此处固定为aws,不能替换为Access Key --> <add key="ClearTextPassword" value="生成的授权令牌" /> </codeartifact> </packageSourceCredentials> </configuration>
注意:Username必须固定为aws,这是AWS CodeArtifact要求的认证格式。
3. (可选)自动化令牌更新
由于授权令牌有有效期,你可以编写脚本自动完成令牌获取和nuget.config更新,避免手动重复操作。以PowerShell为例:
# 获取令牌 $token = aws codeartifact get-authorization-token --domain your-domain --domain-owner your-account-id --region eu-north-1 --duration-seconds 3600 --query authorizationToken --output text # 更新nuget.config(假设文件路径为./nuget.config) $configPath = "./nuget.config" $xml = [xml](Get-Content $configPath) $xml.configuration.packageSourceCredentials.codeartifact.add | Where-Object { $_.key -eq "ClearTextPassword" } | ForEach-Object { $_.value = $token } $xml.Save($configPath)
为什么原配置无效?
AWS CodeArtifact并不支持直接使用IAM Access Key/Secret Key作为NuGet的用户名和密码,它要求使用专门的授权令牌完成认证。之前通过.aws/credentials能正常访问,是因为AWS CLI会自动获取临时令牌并注入到dotnet restore的请求中,而非直接使用文件里的Access Key。
内容的提问来源于stack exchange,提问作者Grimson
相关产品推荐
相关产品推荐

