Azure KeyVault:如何创建 clientId 和 clientSecret?

Enr*_*ico 1 c# azure azure-keyvault asp.net-core

我想将我的应用程序连接到 KeyVault。通常,我可以创建一个新的客户端密钥并在我的代码中使用它。

var _keyVaultClient = new KeyVaultClient(
    async (string authority, string resource, string scope) =>
{
    var authContext = new AuthenticationContext(authority);
    var clientCred = new ClientCredential(clientId, clientSecret);
    var result = await authContext.AcquireTokenAsync(resource, clientCred);
    return result.AccessToken;
});
Run Code Online (Sandbox Code Playgroud)

我可以从 Azure 门户创建一个新的客户端密钥。

在此输入图像描述

现在,我在 KeyVault 中找不到此选项。

在此输入图像描述

Program.cs中我有类似的东西

var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("VaultUri"));
configApp.AddAzureKeyVault(keyVaultEndpoint, new DefaultAzureCredential());
Run Code Online (Sandbox Code Playgroud)

在本地工作正常,但是当我将应用程序部署到 Azure 时,出现此错误:

物理根目录为“C:\home\site\wwwroot”的应用程序“/LM/W3SVC/1699246683/ROOT”已从 Program.Main 退出,退出代码 =“0”。捕获的 stdout 和 stderr 日志的前 30KB 字符:

[10:15:57 FTL] 主机意外终止 Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌。

环境凭据身份验证不可用。环境变量未完全配置。

ManagedIdentityCredential 身份验证不可用,未找到托管身份端点。

SharedTokenCacheCredential 身份验证不可用。在缓存中未找到任何帐户。

在 Azure.Identity.DefaultAzureCredential.GetTokenAsync(Boolean isAsync、TokenRequestContext requestContext、CancellationToken CancellationToken) 在 Azure.Identity.DefaultAzureCredential.GetTokenAsync(TokenRequestContext requestContext、CancellationToken CancellationToken) 在 Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.AuthenticateRequestAsync(HttpMessage 消息、布尔异步)在Azure.Security.KeyVault.ChallengeBasedAuthenticationPolicy.ProcessCoreAsync(HttpMessage消息,ReadOnlyMemory 1 pipeline, Boolean async) at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory1管道,布尔异步)在Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage消息,ReadOnlyMemory 1 pipeline, Boolean async) at Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory1管道)在Azure.Core.Pipeline.HttpPipelineSynchronousPolicy.ProcessAsync( HttpMessage 消息、ReadOnlyMemory 1 pipeline) at Azure.Core.Pipeline.HttpPipeline.SendRequestAsync(Request request, CancellationToken cancellationToken) at Azure.Security.KeyVault.KeyVaultPipeline.SendRequestAsync(Request request, CancellationToken cancellationToken) at Azure.Security.KeyVault.KeyVaultPipeline.GetPageAsync[T](Uri firstPageUri, String nextLink, Func1 itemFactory、字符串操作名称、CancellationToken CancellationToken) 在 Azure.Core.PageResponseEnumerator.FuncAsyncPageable 1.AsPages(String continuationToken, Nullable1 pageSizeHint)+MoveNext() 在 Azure.Core.PageResponseEnumerator.FuncAsyncPageable 1.AsPages(String continuationToken, Nullable1 pageSizeHint)+System.Threading.Tasks.Sources.IValueTaskSource< System.Boolean>.GetResult() 在 Azure.AsyncPageable 1.GetAsyncEnumerator(CancellationToken cancellationToken)+MoveNext() at Azure.AsyncPageable1.GetAsyncEnumerator(CancellationToken CancellationToken)+MoveNext() 在 Azure.AsyncPageable 1.GetAsyncEnumerator(CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult() at Azure.Extensions.AspNetCore.Configuration.Secrets.AzureKeyVaultConfigurationProvider.LoadAsync() at Azure.Extensions.AspNetCore.Configuration.Secrets.AzureKeyVaultConfigurationProvider.LoadAsync() at Azure.Extensions.AspNetCore.Configuration.Secrets.AzureKeyVaultConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList1 提供程序) 在 Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() 在 Microsoft.Extensions.Hosting.HostBuilder .BuildAppConfiguration() 在 Microsoft.Extensions.Hosting.HostBuilder.Build() 在 Skoruba.IdentityServer4.STS.Identity.Program.Main(String[] args) 在 C:\Projects\IdentityServer4\src\Skoruba.IdentityServer4.STS 中。 Identity\Program.cs:第 26 行

进程 ID:13436。文件版本:13.1.20234.8。描述:IIS ASP.NET Core 模块 V2 请求处理程序。提交:c75b3f7a2fb9fe21fd96c93c070fdfa88a2fbe97

kri*_*shg 6

您正在使用DefaultAzureCredential它将通常用于部署时进行身份验证的凭据与用于在开发环境中进行身份验证的凭据结合起来。DefaultAzureCredential 将尝试按顺序通过以下机制进行身份验证。 包含序列的图

它在您本地工作的原因很可能是它能够使用本地盒子(上面的橙色盒子)中的一个进行身份验证。

现在,对于已部署的环境,您需要执行以下操作之一:

  1. 设置托管服务身份并授予对密钥保管库的访问权限。例如,在 Azure 应用服务中,从门户中的“身份”边栏选项卡启用该功能,然后在密钥保管库中分配访问策略(身份名称将与应用服务名称相同)。

或者,2. 在环境变量中设置客户端凭据(例如,如果是 Web 应用程序,则在应用程序设置中)。

  • @Enrico,如果有帮助,请考虑[接受答案](https://stackoverflow.com/help/someone-answers)来结束线程。 (2认同)