【问题标题】:Facing issues in consuming an Azure Active Directory enabled Azure Functions in a azure web application在 Azure Web 应用程序中使用启用了 Azure Active Directory 的 Azure Functions 时面临的问题
【发布时间】:2018-01-12 18:44:13
【问题描述】:

我已为 Azure 函数启用 AAD 身份验证,然后尝试在 Web 应用程序中使用函数应用程序(HTTP 触发器),但出现未经授权的问题。 我还尝试通过创建函数代理来使用它,但问题仍然存在。 后续流程:

  • 创建了两个 AD 应用程序(Web 应用程序、Azure Functions)并提供了 Azure Functions AD 对 Web App AD 的权限 创建了一个基本的 http触发功能
  • 通过提供 Azure 的详细信息为 Azure Functions 启用身份验证 函数
  • 创建了一个 Web 应用程序并在生成访问令牌期间,提供 Azure F 的客户端 ID、Web 应用程序的秘密和受众 URI(应用程序 ID) Unctions 广告。

    ClientCredential clientCredential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientId"], ConfigurationManager.AppSettings["ida:SecretKey"]);
        AuthenticationContext authContext = new AuthenticationContext(Startup.Authority);
        AuthenticationResult result = await authContext.AcquireTokenAsync(ConfigurationManager.AppSettings["azrfunc:ResourceID"], clientCredential);
        string requestUrl = "https://xxxx.azurewebsites.net/api/HttpTriggerCSharp1?code=Gxxxxx==&name=xxxx";
    
        // Make the GET request
        HttpClient client = new HttpClient();
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
        HttpResponseMessage response = client.SendAsync(request).Result;
    

【问题讨论】:

    标签: azure-active-directory azure-functions azure-web-app-service


    【解决方案1】:

    根据您的描述,我假设您将 Authentication and authorization in Azure App Service 用于您的 azure 函数应用程序。

    正如How authentication works in App Service 所述:

    通过网络浏览器与您的应用程序交互的用户将设置一个 cookie,以便他们在浏览您的应用程序时可以保持身份验证。对于其他客户端类型,例如移动设备,应在 X-ZUMO-AUTH 标头中显示的 JSON Web 令牌 (JWT) 将发送给客户端。移动应用客户端 SDK 将为您处理此问题。 或者,Azure Active Directory 身份令牌或访问令牌可以作为不记名令牌直接包含在授权标头中。

    根据您的场景,我创建了我的两个 aad 应用,并为我的 web 应用设置了访问我的函数应用的 aad 应用所需的权限,如下所示:

    并为我的 azure 函数应用启用 AAD 身份验证,如下所示:

    然后使用以下代码获取访问令牌:

    var clientCredential = new ClientCredential("{clientId-for-my-web-app}", "{clientSecret-for-my-web-app}");
    var authContext = new AuthenticationContext("https://login.windows.net/{tenantId}");
    var result = await authContext.AcquireTokenAsync("{clientId-for-my-function-app}", clientCredential);
    

    测试:

    总之,您可以使用https://jwt.io/ 解码您的访问令牌并检查aud,如下所示:

    此外,我注意到您的requestUrl 包含查询字符串code。如果您同时启用功能级授权和基于用户的身份验证,您还需要确保您的功能密钥或主密钥正确。此外,您可以为您的 azure 函数设置匿名授权级别,并利用基于用户的身份验证。

    【讨论】:

    • 感谢布鲁斯,我能够解决这个问题。不同之处在于使用我的函数应用程序的 APP ID URL 而不是函数应用程序的客户端 ID。一旦我改变它,问题就解决了。
    猜你喜欢
    • 2016-06-26
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2016-02-04
    • 2019-03-21
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多