我创建了2个Azure功能应用程序,都使用身份验证/授权进行设置,因此为两者创建了AD应用程序。我想使用MSI将AD Auth从一个功能设置到另一个功能。我使用ARM模板设置了带有托管服务标识的客户端功能。我创建了一个简单的测试函数来获取访问令牌并返回: Microsoft.Azure.Services.AppAuthentication:令牌响应不是预期的格式。
try {
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://myapp-registration-westus-dev.azurewebsites.net/");
log.Info($"Access Token: {accessToken}");
return req.CreateResponse(new {token = accessToken});
}
catch(Exception ex) {
log.Error("Error", ex);
throw;
}
答案 0 :(得分:1)
请检查所使用的资源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 &#34;的AssemblyName&#34;指令。使用NuGet中定义的类型 包,将所需的using语句添加到run.csx文件中。
project.json
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview"
}
}
}
}
run.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;
}
}
答案 1 :(得分:1)
是的,有办法做到这一点。我将在高级别解释,然后在MSI文档积压中添加一个项目,为此编写适当的教程。
您要执行的操作是遵循此Azure AD身份验证示例,但仅配置和实现TodoListService的部分:https://github.com/Azure-Samples/active-directory-dotnet-daemon。
TodoListDaemon的角色将由托管服务标识扮演。因此,您不需要按照自述文件中的说明在Azure AD中注册TodoListDaemon应用程序。只需在您的VM / App服务/功能上启用MSI。
在代码客户端代码中,当您调用MSI(在VM或函数或应用服务中)时,请提供TodoListService的AppID URI作为资源参数。 MSI将为您为该受众群体提取令牌。
TodoListService示例中的代码将向您展示如何在收到该令牌时验证该令牌。
基本上,您要做的是在Azure AD中注册应用程序,为其提供AppID URI,并在调用MSI时使用该AppID URI作为资源参数。然后验证您在服务/接收方收到的令牌。