请检查使用的资源 ID“ https://myapp-registration-westus-dev.azurewebsites.net/ ”是否准确。我按照此处的步骤设置 Azure AD 身份验证,并使用与您相同的代码,并且能够获取令牌。
https://docs.microsoft.com/en-us/azure/app-service/app-service-mobile-how-to-configure-active-directory-authentication
您还可以运行此代码来检查 MSI 返回的确切错误。如果它不能帮助解决问题,请发布错误。
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
var response = await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), "https://myapp-registration-westus-dev.azurewebsites.net/", "2017-09-01"));
string msiResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
log.Info($"MSI Response: {msiResponse}");
更新:-
这个 project.json 文件和 run.csx 文件对我有用。注意:project.json 指的是 .NET 4.6,根据 Azure Functions 文档(评论中的链接),.NET 4.6 是目前唯一受支持的版本。您无需再次上传引用的程序集。最有可能的是,不正确的手动上传 netstandard 程序集,而不是 net452 会导致您的问题。
仅支持 .NET Framework 4.6,因此请确保您的 project.json 文件指定 net46,如此处所示。当您上传 project.json 文件时,运行时会获取包并自动添加对包程序集的引用。您不需要添加 #r "AssemblyName" 指令。若要使用 NuGet 包中定义的类型,请将所需的 using 语句添加到 run.csx 文件中。
项目.json
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview"
}
}
}
}
运行.csx
using Microsoft.Azure.Services.AppAuthentication;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
try
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://vault.azure.net/");
log.Info($"Access Token: {accessToken}");
return req.CreateResponse(new {token = accessToken});
}
catch(Exception ex)
{
log.Error("Error", ex);
throw;
}
}