AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证

Posted

技术标签:

【中文标题】AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证【英文标题】:Azure App Service Easy Auth with Client Credentials Grant flow in AAD B2C 【发布时间】:2019-05-16 03:29:13 【问题描述】:

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

我有一个应用服务正在通过 Azure AD B2C 进行身份验证。在那个 B2C 租户中,我注册了 Web 应用程序/API,并且身份验证可以正常使用 Web 应用程序。 我在该 AD B2C 应用的 Published Scopes 部分中添加了一个范围,还为该范围添加了一个 App ID URI。 然后我在租户中创建了另一个应用程序(ClientApp)来代表我想要提供对第一个 API 的访问的另一个服务。我为它生成了一个密钥,并在 API 访问部分添加了我在另一个应用程序中创建的范围。

然后在邮递员中,我使用下一个获取令牌

授权类型:客户端凭据 访问令牌 URL:https://login.microsoftonline.com/mytenantname.onmicrosoft.com/oauth2/v2.0/token(出于某种原因,我必须使用 login.microsoftonline,因为 b2clogin 域不适用于此) 客户端 ID:显示在为 ClientApp 注册的应用程序中的 ID Client secret:ClientApp下生成的secret 范围:我添加了 Web 应用注册的应用 ID URI。

我成功获取了令牌,但是当我尝试使用带有邮递员的不记名令牌访问网站时,我只得到 401。

【问题讨论】:

是的,你可以。我只是在这里给你一个概述。只需打开 Azure App 服务中可用的“身份验证/授权”,并使用任何服务提供商(例如 AzureAD)对其进行配置,它就会创建服务主体。完成后转到 Azure AD 中的服务主体并获取 ClientID/Secret 以在您的客户端应用程序中使用它们来获取访问令牌。使用访问令牌作为“授权”承载令牌来调用 WebAPI 端点。 @Imran 我编辑了我的问题以提供有关我的情况的更多详细信息。我应该在 Azure AD 中而不是在 B2C 租户中注册客户端应用程序,以便按照您所说的进行操作吗? 您将向用于保护您的 webapi/webapp 的租户注册客户端应用程序,在您的情况下为 AzureB2C。你使用什么样的客户端?由于注册桌面客户端与 Web 客户端不同。在这里找到更多docs.microsoft.com/en-us/azure/active-directory-b2c/…。关于 401 有很多原因,但大多数时候是因为错误的受众。您可以找到我的答案并打开日志记录以确切了解您收到 401 的原因。***.com/a/53591038/1041953 客户端应用是另一个应用服务。你的意思是我应该看什么日志? Web api 日志不会包含任何内容,因为我无法通过身份验证,因此该应用程序永远不会受到攻击。 对于观众,我所做的是将在 B2C 中注册为客户端应用程序的应用程序的 ID 作为 clientId 输入,并将在该应用程序中生成的秘密作为秘密输入。但也尝试使用主 web api 应用程序的 web 应用程序 id 并为其生成一个秘密,它也不起作用。 【参考方案1】:

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

此解决方案:https://***.com/a/48657826/11721142 不适用于我的 B2C 设置(几乎是理想的 :))。我不得不改变原来的:

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

收件人:

"additionalLoginParams": [
  "scope="scope=https://xxx.onmicrosoft.com/Guid/all+openid+offline_access""
]

在哪里

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

然后...最后我可以调用frontend-app-domain/.auth/login/aad 并且...请参阅:frontend-app-domain/.auth/me 之后的 access-token、id-token 和 refresh-token

您还可以提供所需的范围,例如:frontend-app-domain/.auth/login/aad?scope=&lt;see scopes above&gt;

【讨论】:

【参考方案2】:

不支持对 AAD B2C 应用程序注册使用 client_credentials 流。因此,您必须改为通过普通的 Azure AD 刀片创建应用注册。https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-apps#current-limitations

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

您将需要使用可以接受来自多个机构的令牌的库。这里有一个例子:Use multiple JWT Bearer Authentication

【讨论】:

【参考方案3】:

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

我仍在尝试确定是否可以将 URL 用作范围...

【讨论】:

以上是关于AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Active Directory 图形客户端删除 AAD B2C 中的用户

向 AAD B2C 注册 AzureFunctions 应用程序

无法通过具有客户端凭据流的 CloudFlare Worker 对 Spotify API 进行 OAuth

在 AAD B2C 中更改登录名

python 将Json Web Keys(JWK)下载并组合到一个JWK中,用于所有指定的Azure Active Directory B2C(AAD B2C)策略。

Office 365 客户端凭据中的错误回调授予 OAuth2 流