Azure功能是否支持MSI进行身份验证

时间:2017-10-04 14:20:49

标签: azure-msi

我创建了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;
}

2 个答案:

答案 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作为资源参数。然后验证您在服务/接收方收到的令牌。