受Azure AD保护的Azure功能-从本机应用调用时获取HTTP 401

时间:2020-05-29 01:52:44

标签: azure authentication azure-functions

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

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

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

我注册了Azure AD应用并配置了本机应用身份验证的设置:

Azure AD App Registration Settings

我在“公开API” bladd中配置了我的应用 Expose an API

我还添加了API权限

API Permission

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

Azure Functions Authorization Settings

我正在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;

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

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

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

enter image description here

这是电话返回时的WWW-Authenticate标头内容

www-authentication

当我检查我获得的令牌时,似乎合法

Token

知道我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

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

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

相反。

user.read是Microsoft Graph API的权限。

答案 1 :(得分:0)

因此,SO articleambrose-leung终于使我得以成功工作