我们有一个 Web api(.NET 5),它可以从 Azure KeyVault 访问一些机密。
在用于开发的本地计算机中,由于我是创建的新保管库的所有者,因此我的电子邮件具有对 keyvault 的访问权限。
因此,我通过 VS --> 工具 > 选项 --> Azure 服务身份验证 --> 帐户选择 --> "myemail@.com" 选择了我的帐户
我有下面的代码来从 Keyvault 获取机密并通过配置进行访问,就像我们访问 appsettings 值一样。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
var appSettings = config.Build();
var credentialOptions = new DefaultAzureCredentialOptions();
var credential = new DefaultAzureCredential(credentialOptions);
config.AddAzureKeyVault(new Uri(appSettings["Url:KeyVault"]), credential);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Run Code Online (Sandbox Code Playgroud)
我们在服务和控制器层中访问像 _configuration["secret"] 这样的秘密值。
我的查询是
1,如果我将此代码部署到本地服务器,它将如何工作(开发环境是本地服务器)?
2,如果我将此Web API部署到Azure,如何使用身份AD应用程序访问密钥保管库而无需更改任何代码。我们注册了 AD 应用程序,该应用程序具有对此特定 Vault 的读取权限。
我希望代码能够在本地和 Azure 上无缝运行。
azure-keyvault azure-managed-identity .net-5 defaultazurecredential
我使用默认的 azure 凭据方法获取访问令牌,同时使用函数应用程序的托管标识获取访问令牌。我能够获取令牌。但现在我不确定如何对该方法进行单元测试。这是当前状态
private async Task RefreshTokenCache()
{
var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new string[] { _config[AppConstants.ADAPIAppId] + "/.default" }) { });
accessTokenCache.Set(AppConstants.AccessToken, accessToken.Token, DateTimeOffset.Now.AddMinutes(55));
}
Run Code Online (Sandbox Code Playgroud)
是否有像 httpclientfactory 这样的东西,我可以在其中注入或传递一些连接字符串,以便我告诉 DefaultAzureCredential 不要调用 Azure?
更新
我正在添加更多上下文。我使用它从 azure 获取函数应用程序中的访问令牌,以向 APIM 进行自身身份验证。所以我使用 HttpMessageHandler 来检查令牌是否不存在,调用 Azure 并获取令牌。
在功能应用程序中启动。
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient(AppConstants.ReplyService)
//Adding token handler middleware to add authentication related details.
.AddHttpMessageHandler<AccessTokenHandler>();
}
Run Code Online (Sandbox Code Playgroud)
处理程序文件:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// Use …Run Code Online (Sandbox Code Playgroud) c# unit-testing azure azure-managed-identity defaultazurecredential
我有这个 Web 应用程序,可以访问存储在 Azure 云中的密钥库。
为了访问此 KeyVault,我使用 IConfigurationBuilder 扩展
configuration.AddAzureKeyVault(new Uri(KeyvaultUri), new DefaultAzureCredential(true));
Run Code Online (Sandbox Code Playgroud)
我为所有需要访问该身份的用户创建了一个托管身份,这意味着他们应该能够运行该应用程序,并在通过 SSO 登录后能够访问 keyvault,目前他们每次启动时都必须这样做应用程序,因为 new DefaultAzureCredential(true)我不明白的是为什么每次都需要每次请求它,而不是在输入一次后将凭据存储在某个地方,并使用该存储的凭据,我可以在初始登录后以某种方式在本地存储所需的凭据吗?
当一个人启动应用程序时总是登录有点不方便,并且调试应用程序由于所需的登录而变得有点冗长。
是否可以以某种方式让登录在后台发生 - 或者以某种方式在首次登录后存储凭据?
我觉得这有点偏离轨道 - 我正在寻求的解决方案应该适用于那些通过视觉工作室之外的终端运行该解决方案的人。例如前端开发人员 - 他们只需要一个后端来提出请求,而不是别的。
我有一个在天蓝色中运行的容器应用程序服务,它工作正常。
但是,如果我想在本地运行此容器,它会失败,因为它无法进行身份验证以读取天蓝色中的密钥保管库。
.ConfigureAppConfiguration((context, config) =>
{
var builtConfig = config.Build();
string SecretUri = $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/";
var secretClient = new SecretClient(new Uri(SecretUri), new DefaultAzureCredential(new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true }));
config.AddAzureKeyVault(secretClient, new KeyVaultSecretManager());
})
Run Code Online (Sandbox Code Playgroud)
在 azure 中运行时,DefaultAzureCredential 将从应用程序服务继承其权限,并且工作正常。
但是,如果我想在本地运行容器以在天蓝色之外进行测试,它不知道要使用什么权限。我应该如何处理这个问题?我可以以某种方式告诉容器使用哪些权限而不对容器进行开发更改吗?