【问题标题】:Is Azure Function to Function authentication with MSI supported是否支持使用 MSI 的 Azure Function to Function 身份验证
【发布时间】:2018-03-15 23:46:52
【问题描述】:

我创建了 2 个 Azure 函数应用程序,都设置了身份验证/授权,因此为两者创建了一个 AD 应用程序。我想使用 MSI 将 AD Auth 从一个功能设置到另一个功能。我使用 ARM 模板使用托管服务标识设置客户端功能。我创建了一个简单的测试函数来获取访问令牌并返回:Microsoft.Azure.Services.AppAuthentication: Token response is not in the expected format.

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;
}

【问题讨论】:

    标签: azure-managed-identity


    【解决方案1】:

    是的,有办法做到这一点。我会在高层次上进行解释,然后在 MSI 文档积压中添加一个项目,以便为此编写适当的教程。

    您要做的是遵循此 Azure AD 身份验证示例,但只配置和实现 TodoListService 的部分:https://github.com/Azure-Samples/active-directory-dotnet-daemon

    TodoListDaemon 的角色将由托管服务标识代替。因此,您无需按照自述文件中的说明在 Azure AD 中注册 TodoListDaemon 应用。只需在您的 VM/应用服务/功能上启用 MSI。

    在您的代码客户端代码中,当您调用 MSI(在 VM 或函数或应用服务中)时,提供 TodoListService 的 AppID URI 作为资源参数。 MSI 将为您获取该受众的令牌。

    TodoListService 示例中的代码将向您展示如何在收到该令牌时对其进行验证。

    所以本质上,您要做的是在 Azure AD 中注册一个应用程序,为其提供一个 AppID URI,并在调用 MSI 时使用该 AppID URI 作为资源参数。然后验证您在服务/接收方收到的令牌。

    【讨论】:

      【解决方案2】:

      请检查所使用的资源 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 文档(cmets 中的链接),.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;
          }    
      }
      

      【讨论】:

      • "Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview",
      • 将 client.GetAsync() 与相同的资源 uri 一起使用会返回一个有效的令牌。在 Azure 函数中,我使用 NuGet 来解析 AppAuthentication 组件并使用 #r "..\bin\..." 进行引用。我正在使用此参考:"Microsoft.Azure.Services.AppAuthentication": "1.0.0-preview" 这是最新版本吗?此外,对该函数进行后续调用会导致 GetAccesstokenAsync() 挂起并且永远不会返回。
      • 您能否分享您从 client.GetAsync() 获得的响应 - 被记录的“MSI 响应”?请用占位符替换访问令牌(例如“eyJ0eXAi...”)。只是想确保响应格式符合预期。 NuGet 版本是正确的,并且是唯一的版本。
      • MSI响应:{ “ACCESS_TOKEN”: “eyJ0eXAiOiJKV1QiLCJhtwk9uc9sNTVr9ado8JflIpBU4drh0tN7Wue5-HBzcuQGCWmMYPcFoQm-uI7R6wP0WrkayVBD4RPY_CJ8o4HfOLwQ01qJhazujpv3xaAsg ....... ”, “expires_on”:“2017年10月5日2:27 :54 AM +00:00","re​​source":"MASKED-registration-westus-dev.azurewebsites.net","to…"}
      • 2017-10-05T01:39:06.375 System.FormatException :令牌响应不是预期的格式。在 Microsoft.Azure.Services.AppAuthentication.TokenResponse.Parse(String tokenResponse) 在 async Microsoft.Azure.Services.AppAuthentication.MsiAccessTokenProvider.GetTokenAsync(String resource,String authority) 在 async Microsoft.Azure.Services.AppAuthentication.NonInteractiveAzureServiceTokenProviderBase.GetTokenAsync( ??) 在异步 Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsyncImpl(String authority,String resource,String scope) at async
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多