Azure AD-公开API以使用具有应用程序权限的API

Azure AD-公开API以使用具有应用程序权限的API,api,azure-active-directory,Api,Azure Active Directory,我正在开发一个自定义API和一个windows服务。我想在api和windows服务之间使用Azure AD进行身份验证和授权 我的问题是:如何公开API,以便将API权限添加到类型为“应用程序权限”的win服务 当我想将api权限添加到win服务时,我只能选择“委派权限”。但是我需要“应用程序任务”,因为win服务在没有用户的情况下运行 谢谢你的转发 致意 马蒂亚斯 嗯。现在我知道了如何在应用程序注册中设置清单。我还获得了一个bearor令牌,在bearor令牌中我可以看到(如果我对其进行解

我正在开发一个自定义API和一个windows服务。我想在api和windows服务之间使用Azure AD进行身份验证和授权

我的问题是:如何公开API,以便将API权限添加到类型为“应用程序权限”的win服务

当我想将api权限添加到win服务时,我只能选择“委派权限”。但是我需要“应用程序任务”,因为win服务在没有用户的情况下运行

谢谢你的转发

致意 马蒂亚斯


嗯。现在我知道了如何在应用程序注册中设置清单。我还获得了一个bearor令牌,在bearor令牌中我可以看到(如果我对其进行解码)Web API的客户端ID以及应用程序角色:“角色”:[“User.Sync2”] 所以我认为代币是正确的

在第二步中,我调用Web API(https://localhost:44358/api/AzureADB2C/Ping)使用身份验证“Bearor”和令牌。但后来我收到了401。(我没有在Web API的应用程序注册中注册任何平台,因此也没有重定向URI。但我想我不需要它?)

以下是我的Web API项目的Startup.cs(它是使用Visual Studio生成的标准版本):

这是我的API控制器:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace AzureADB2CConnect.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AzureADB2CController : ControllerBase
    {
        [HttpGet("Ping")]
        [Authorize(Roles = "User.Sync2")]
        //[Authorize]
        public async void GetPing()
        {
            //foreach(Claim claim in ClaimsPrincipal.Current.Claims)
            //{

            //}
        }
    }
}
如果删除“Authorized”标记,我可以调用API。无论我是只使用Authorize还是Authorize(Roles=“User.Sync2”),我都会收到401

错误/错误在哪里

谢谢你的转发


以下是已解码的bearor令牌:


这就是我调用GET方法来获取令牌的方式:
您需要添加应用程序角色。请跟我来。允许的应用程序角色成员类型应包括应用程序。

我可以重现您的问题。验证令牌时输入了错误的参数。您需要将
Authorized
更改为
Authorization
并将
Bearor
更改为
Bearer


我的文章可能在这里有所帮助:用于解析您的令牌并提供屏幕截图。您是公开Azure AD应用程序的api还是Azure AD b2c应用程序的api?对于此api,我使用的是Azure AD而不是Azure AD b2c。我添加了一个解码令牌的屏幕截图。401的原因是您使用了错误的令牌来调用Api。检查您令牌的
aud
,确保它与您想要请求的Api一致。感谢Alfredo R.和juunas。我想这就是我想要的。现在我已经在Azure AD中的应用注册清单中实现了一个应用角色。但是现在我不知道如何在我的windows服务(不在Azure中托管)中调用Web API。我已经使用Bear令牌成功调用了Microsoft Graph API。但我不知道如何更改此代码以将其用于我的Web API。我已经收到了一个熊牌或代币。但是当我想把这个令牌用于我的Web API时,我得到了一个401。我不知道错误是在我的win服务中还是在Web API中。很抱歉我回答得太晚,但我正忙于另一个项目。我已经用过“授权”和“持票人”。这里的帖子里只有拼写错误。但《邮递员》写的是对的。现在,我已经联系了一位业务合作伙伴以获得开发支持。我知道后会告诉你答案的。但是如果你还有别的想法,我将非常感激!
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace AzureADB2CConnect.API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AzureADB2CController : ControllerBase
    {
        [HttpGet("Ping")]
        [Authorize(Roles = "User.Sync2")]
        //[Authorize]
        public async void GetPing()
        {
            //foreach(Claim claim in ClaimsPrincipal.Current.Claims)
            //{

            //}
        }
    }
}