在AAD B2C中使用客户端凭据授予流的Azure应用程序服务轻松身份验证

在AAD B2C中使用客户端凭据授予流的Azure应用程序服务轻松身份验证,azure,azure-ad-b2c,Azure,Azure Ad B2c,是否可以使用内置的身份验证/授权选项在Azure内的应用程序服务中保护Web API,同时使用OAuth客户端凭据授予流访问它 我有一个应用程序服务正在通过Azure AD B2C验证。在该B2C租户中,我注册了web应用程序/API,并且使用web应用程序的身份验证工作正常。 我在该广告B2C应用程序的“已发布范围”部分添加了一个范围,还为该范围添加了一个应用程序ID URI。 然后,我在租户中创建了另一个应用程序(ClientApp),以表示我希望提供对第一个API的访问的另一个服务。我为它

是否可以使用内置的身份验证/授权选项在Azure内的应用程序服务中保护Web API,同时使用OAuth客户端凭据授予流访问它

我有一个应用程序服务正在通过Azure AD B2C验证。在该B2C租户中,我注册了web应用程序/API,并且使用web应用程序的身份验证工作正常。 我在该广告B2C应用程序的“已发布范围”部分添加了一个范围,还为该范围添加了一个应用程序ID URI。 然后,我在租户中创建了另一个应用程序(ClientApp),以表示我希望提供对第一个API的访问的另一个服务。我为它生成了一个密钥,并且在API访问部分添加了我在另一个应用程序中创建的范围

然后在《邮递员》中,我使用下一个

  • 授予类型:客户端凭据
  • 访问令牌URL:(出于某种原因,我必须使用login.microsoftonline,因为b2clogin域不适用于此)
  • 客户端ID:为ClientApp注册的应用程序中显示的ID
  • 客户端秘密:在ClientApp下生成的秘密
  • 作用域:我在web应用注册中添加的应用ID URI

我成功地获得了令牌,但当我尝试使用带邮递员的承载令牌访问网站时,我只得到了401。

不确定我是否正确理解它,但您似乎使用了URL作为作用域。如果您将作用域设置为应用程序服务的应用程序id(您可以在azure AD中找到具有您的应用程序服务名称的企业应用程序),而不是使用URL,则可以使用此功能。(格式:/.default)


我仍在试图弄清楚是否可以将URL用作作用域…

不支持对AAD B2C应用程序注册使用
客户端凭据流。因此,您必须改为通过普通Azure广告刀片创建应用注册。

然后,应用程序服务必须接受来自两个不同机构的令牌,而应用程序服务无法使用EasyAuth(在应用程序服务配置菜单中启用身份验证)

相反,您需要使用一个可以接受来自多个机构的令牌的库。这里有一个例子:

我花了好几个小时才找到合适的解决方案

此解决方案:不适用于我的B2C设置(几乎是理想的:)。我不得不改变原来的:

"additionalLoginParams": [
  "response_type=code id_token",
  "resource=<AAD-app-id-for-your-webapi-webapp>"
]
在哪里

https://xxx.onmicrosoft.com/{Guid}/all
是B2C API权限中定义的范围标识符

然后。。。最后,我可以调用
{frontend app domain}/.auth/login/aad
,然后。。。请参阅:
{frontend app domain}/.auth/me


您还可以提供如下所需的作用域:
{frontend app domain}/.auth/login/aad?scope=

可以。我在这里只是给你一个概述。只需打开Azure App services中可用的“身份验证/授权”,并与任何服务提供商(如AzureAD)进行配置,即可创建服务主体。完成后,转到Azure AD中的服务主体并获取ClientID/Secret,以便在客户端应用程序中使用它们来获取访问令牌。使用访问令牌作为“授权”承载令牌来调用WebAPI端点。@Imran我编辑了我的问题,以提供有关我的情况的详细信息。我是否应该在Azure广告中而不是B2C租户中注册客户端应用程序以实现您所说的目的?您将向租户注册客户端应用程序,您将使用该租户来保护您的webapi/webapp,在您的案例中是AzureB2C。您使用的是哪种客户机?因为注册桌面客户端不同于web客户端。在这里找到更多。关于401,有很多原因,但大多数时候都是因为错误的受众。你可以找到我的答案,然后打开日志,确切地知道为什么你会得到401。客户端应用程序是另一个应用程序服务。你是说我应该看什么日志?web api日志将不包含任何内容,因为我无法通过身份验证,所以应用程序从未被命中。对于观众,我所做的是将B2C中注册为客户端应用程序的应用程序的id作为clientId输入,并将该应用程序中生成的秘密作为密码输入。但也尝试使用主web api应用程序的web应用程序id,并为其生成了一个秘密,但它也不起作用。
"additionalLoginParams": [
  "scope="scope=https://xxx.onmicrosoft.com/{Guid}/all+openid+offline_access""
]