使用 Azure Active Directory 的 Azure Function 身份验证

Vis*_*nha 5 c# azure oauth-2.0 azure-active-directory azure-web-app-service

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

当我手动登录到 Azure Function 终结点时,身份验证工作。但是当我尝试以编程方式访问 API 时,没有任何手动用户干预,我面临身份验证问题:

Status Code:401, Unauthorized
Run Code Online (Sandbox Code Playgroud)

我使用以下代码使用 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;
Run Code Online (Sandbox Code Playgroud)

然后我尝试将在标头中收到的访问令牌发送到我的 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}");
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*SFT 5

如果你的azure function认证级别是匿名的或者需要function key的话,我们可以使用accesstoken直接访问你的azure function api 。

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

  "https://{functionAppName}.azurewebsites.net/.auth/login/aad/callback"
Run Code Online (Sandbox Code Playgroud)

所以我添加了https://{functionAppName}.azurewebsites.net/允许的观众

在此处输入图片说明

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

在此处输入图片说明

我们也可以使用以下方式来获取简单的身份验证令牌。访问令牌是您获得的令牌。

Post https://xxx.azurewebsites.net/.auth/login/aad
Content-Type:application/json
{
    "access_token":"eyJ0eXAiOix...rtf2H7lyUL-g34HVw"
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

在此处输入图片说明

注意:标题是x-zumo-auth:令牌