首页 > 解决方案 > 使用 Azure AD 保护的 Azure Functions - 从本机应用程序调用时获取 HTTP 401

问题描述

我的目标是使用 Azure AD 保护我的 Azure Functions 并从 WPF 应用程序调用它们。

我有一个具有以下定义的 Azure 函数:

public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
        HttpRequest req,
        ILogger log,
        ExecutionContext context,
        ClaimsPrincipal claimsPrincipal)

我注册了一个 Azure AD App 并配置了 Native App Authentication 的设置:

Azure AD 应用注册设置

我在“公开 API”中配置了我的应用程序 公开一个 API

我还添加了一个 API 权限

API 权限

我在身份验证/授权刀片的 Azure Functions 应用程序中关联了我的应用程序。

Azure Functions 授权设置

我在 WPF 应用程序中从 Azure AD 获取令牌(使用 Microsoft.Identity.Client 库)

            string applicationID = "***"; // My AppID Guid
            PublicClientApp = PublicClientApplicationBuilder.Create(applicationID)
                .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
                .Build();

            var listScopes = new List<string>
            {
                //"user.read" - Removed based on @tony-yu recommendation
                $"api://{applicationID}/MyScope"
            };

            var authResult = await PublicClientApp.AcquireTokenInteractive(listScopes)
                                      .ExecuteAsync();

            var myToken = authResult.AccessToken;

我可以毫无问题地进行身份验证,并且我成功获得了令牌,但是每当我调用我的函数并在授权标头(授权 = Bearer ****)中提供我的令牌时,我都会得到:

401 - 您无权查看此目录或页面。

这就是我所说的(邮递员):

在此处输入图像描述

这是调用返回时的 WWW-Authenticate 标头内容

www-认证

当我检查我得到的令牌时,它似乎是合法的

令牌

知道我做错了什么吗?

标签: azureauthenticationazure-functions

解决方案


范围不正确。当您要访问受广告保护的功能时,您需要使用

var listScopes = new List<string>
            {
                "{applicationID}/.default"
            };

反而。

user.read是 Microsoft Graph API 的权限。


推荐阅读