我正在尝试使用针对Azure Key Vault
的{{1}}在ASP.NET (.Net Framework) MVC
Web应用程序中连接Visual Studio 2017 Community 15.7.5 Connected Service
。
它添加了一个名称为.Net 4.7.2
的{{1}}和一个名为configBuilder
的属性,该属性会引发AzureKeyVault
警告。
运行应用程序时,我收到一个错误,提示vaultName
标记上的"The 'vaultName' attribute is not allowed."
像这样:
我正在使用以下所有最新的软件包版本:
configBuilders attribute
appsetting
进行了更新,但这是一个预览,它导致了其他软件包的依赖性问题。
答案 0 :(得分:4)
tldr; -您可能没有访问密钥库的适当权限。
在.Net框架的当前发布版本中,关于配置生成器的详细错误并不总是很容易在ASP.NET黄屏中发现。我们在vNext中进行了更改,以解决此问题,但当前是4.7.1 / 2的问题。暂时,如果您创建一个简单的控制台应用程序以读取具有相同配置构建器配置的appSettings,则应该在堆栈中看到更多的异常信息,这些信息会吐出来。
基于您发布的黄色屏幕,尽管我会猜测(并且它实际上只是基于过去的报告的有根据的猜测,而您的情况没有具体说明),您正遇到Microsoft.Azure.Services.AppAuthentication库中的身份验证问题。在Visual Studio中运行时,该库可以使用您的个人凭据来访问密钥库。如果部署在Azure中,他们将使用其他魔术技术对密钥库进行身份验证。如果要消除“魔术”并对此进行更多控制,则可以使用“ connectionString”属性指定更详细的连接信息。在我们的GitHub页面(MicrosoftConfigurationBuilders)上有更多信息以及连接字符串详细信息的链接。
至于“不允许'vaultName'属性。”警告...这只是一个警告。 VS用于验证配置的.xsd未正确更新,以允许configBuilder定义上具有随机属性。我们希望在下一个框架发布时的将来VS版本中解决此问题。
答案 1 :(得分:1)
史蒂夫·莫洛伊(Steve Molloy)是正确的,因为配置错误是红色鲱鱼。我创建了一个控制台应用程序,错误消息要好得多,但是仍然需要进行一些调查。这是我的控制台应用程序代码和软件包:
static void Main(string[] args)
{
var azureServiceTokenProvider = new AzureServiceTokenProvider
(azureAdInstance:"https://InsertAADSubscriptionName.onmicrosoft.com/");
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = keyVaultClient.GetSecretAsync(
"https://InsertKeyVaultName.vault.azure.net", "InsertSecretYouWantBack").GetAwaiter().GetResult();
}
<packages>
<package id="Microsoft.Azure.KeyVault" version="3.0.0" targetFramework="net472" />
<package id="Microsoft.Azure.KeyVault.WebKey" version="3.0.0" targetFramework="net472" />
<package id="Microsoft.Azure.Services.AppAuthentication" version="1.0.3" targetFramework="net472" />
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.8" targetFramework="net472" />
<package id="Microsoft.Rest.ClientRuntime" version="2.3.13" targetFramework="net472" />
<package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.15" targetFramework="net472" />
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net472" />
</packages>
我在最后一个括号中放置了一个断点,并一直在变量secret
中寻找我的秘密值。我不断收到以下错误,指示Azure AD无法验证我的本地环境并返回访问令牌。
Parameters: Connection String: [No connection string specified],
Resource: https://vault.azure.net,
Authority: https://login.windows.net/47c8ce10-a05d-4880-9e92-0c2d2c00dc88.
Exception Message: Tried the following 4 methods to get an access token,
but none of them worked.
Parameters: Connection String: [No connection string specified],
Resource: https://vault.azure.net,
Authority: https://login.windows.net/47c8ce10-a05d-4880-9e92-0c2d2c00dc88.
Exception Message: Tried to get token using Managed Service Identity.
Unable to connect to the Managed Service Identity (MSI) endpoint.
Please check that you are running on an Azure resource that has MSI setup.
Parameters: Connection String: [No connection string specified],
Resource: https://vault.azure.net,
Authority: https://login.windows.net/47c8ce10-a05d-4880-9e92-0c2d2c00dc88.
Exception Message: Tried to get token using Visual Studio.
Access token could not be acquired.
Parameters: Connection String: [No connection string specified],
Resource: https://vault.azure.net,
Authority: https://login.windows.net/47c8ce10-a05d-4880-9e92-0c2d2c00dc88.
Exception Message: Tried to get token using Azure CLI. Access token could
not be acquired. ERROR: Please run 'az login' to setup account.
Parameters: Connection String: [No connection string specified],
Resource: https://vault.azure.net,
Authority: https://login.windows.net/47c8ce10-a05d-4880-9e92-0c2d2c00dc88.
Exception Message: Tried to get token using Active Directory Integrated
Authentication. Access token could not be acquired. get_user_name_failed:
Failed to get user nameInner Exception : No mapping between account names
and security IDs was done
问题在于,由于我在本地运行该应用程序,因此需要在本地登录Azure CLI。为此,请执行以下操作:首先在计算机上安装Azure CLI,然后转到CMD或PowerShell提示符并键入az login
,然后按照返回的说明进行操作。
这成功了;控制台应用程序就能获取访问令牌。
我在上面原始问题中的网络应用程序上对其进行了尝试,并且运行正常。