【问题标题】:Azure Function authentication using Azure Active Directory使用 Azure Active Directory 的 Azure Function 身份验证
【发布时间】:2018-11-27 12:41:21
【问题描述】:

我想在 Azure Functions 上启用身份验证。因此,我决定使用 EasyAuth(平台功能下的身份验证/授权链接)并成功配置身份验证过程。

当我手动登录到 Azure Function 终结点时,身份验证有效。但是,当我尝试以编程方式访问 API 时,无需任何手动用户干预,就会遇到身份验证问题:

Status Code:401, Unauthorized

我使用以下代码使用 clientID 和 clientSecret 从 AAD 获取访问令牌:

AuthenticationContext context = new AuthenticationContext("https://login.windows.net/<tenant-id>");
string key = "<client-secret>";
ClientCredential cc = new ClientCredential("<client-id>", key);
AuthenticationResult result = context.AcquireTokenAsync("https://<AzureFunctionAppName>.azurewebsites.net/", cc).Result;
return result.AccessToken;

然后我尝试将在标头中收到的访问令牌发送到我的 API 的新请求:

var content = "{\"on\":true, \"sat\":254, \"bri\":254, \"hue\":10000}";
var AADToken = GetS2SAccessToken();
HttpClient Client = new HttpClient();
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AADToken);
var foo = Client.PostAsync("https://<AzureFunctionAppName>.azurewebsites.net/.auth/login/aad", new StringContent(content.ToString())).Result;
Console.WriteLine($"result: {foo}");

但是上面的代码会导致未经授权的调用。我不确定我做错了什么。

【问题讨论】:

    标签: c# azure oauth-2.0 azure-active-directory azure-web-app-service


    【解决方案1】:

    如果您的 azure function 身份验证级别为匿名或还需要 function key,我们可以使用 accesstoken 直接访问您的 azure function api。

    我通过您提到的方式获得了访问令牌。根据 Azure 资源门户 (https://resources.azure.com/),默认 allowedAudiences 是

      "https://{functionAppName}.azurewebsites.net/.auth/login/aad/callback"
    

    所以我将https://{functionAppName}.azurewebsites.net/ 添加为允许的受众

    然后我可以直接使用访问令牌。我用邮递员测试它。

    我们也可以通过以下方式获取easy auth token。访问token就是你拿到的token。

    Post https://xxx.azurewebsites.net/.auth/login/aad
    Content-Type:application/json
    {
        "access_token":"eyJ0eXAiOix...rtf2H7lyUL-g34HVw"
    }
    

    之后我们就可以使用get token来访问azure函数api了

    注意:标头是x-zumo-auth:token

    【讨论】:

    • 我将网址添加到允许的观众并使用邮递员;我仍然收到消息“您无权查看此目录或页面”。我是否有可能从 AAD 获得了错误的 access_token?你这里提到的两种方法我都试过了
    • 你的天蓝色功能认证级别是匿名的吗?如果没有,还需要添加功能键。添加允许的观众后,请获取新的访问令牌再试一次。
    • 您好,我能够解决问题。问题在于生成的 AAD 令牌。在 context.AcquireTokenAsync("https://.azurewebsites.net/", cc).Result 中传递应用程序 ID 而不是 "https://.azurewebsites.net/"帮助
    【解决方案2】:

    关于这个问题,您需要创建一个客户端应用程序来调用您的 Azure 函数。详细步骤如下。

    1. 为 Azure Function 配置 Azure AD。请参考https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings#auth

      我。转到集成触发器,将授权级别设置为匿名

      二。进行身份验证/授权并配置 Azure AD

    2. 在 Azure 门户上的 AD 中注册客户端应用程序。更多详情请参考https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v1-integrate-apps-with-azure-ad

      一个。打开 Azure Active Directory 并单击 App registrations ,选择 New application registration。

      b.输入您的名称和重定向 URL,您可以编写任何内容。然后点击创建按钮。

      c。设置->所需权限->添加,选择你在step1中使用的应用

      d。选择权限->应用权限->选择->完成->授予权限->是

      e。创建密钥并复制它

      f。复制应用程序 ID

    3. 测试

    获取令牌:

    METHOD: POST
    
    Url : https://login.microsoftonline.com/your directory ID/oauth2/token 
    
    HEADERS:  Content-Type : application/x-www-form-urlencoded
    
    BODY:
    grant_type+=client_credentials&resource+=”your Function APP ID”&client_id+++++=”the application that your register  id”&client_secret+=”the key you create”
    

    测试功能:

    METHOD: Get
    
    Url : https://<Functionname>.azurewebsites.net/api/HttpTriggerCSharp1?name=azure
    
    HEADERS:  Authorization : Bearer <access token>
    

    【讨论】:

    • 非常全面。谢谢。
    • 是否可以在请求标头中传递 client_secret 和 Client_id?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2016-12-15
    • 2016-01-12
    • 2018-03-20
    相关资源
    最近更新 更多