使用 Azure AD 进行无头身份验证(user/pass 组合)

Headless authentication with Azure AD (user/pass combination)

我正在按照 Microsoft here 提供的指南和示例进行操作,我能够让演示正常工作,在控制台应用程序中进行身份验证,然后向 Web 发出请求 API 使用正确的标记。

我想使用它,但控制台应用程序中的代码需要移至 Web 应用程序。本质上:外部服务器尝试访问安全 Web API,在 HTTPS 请求的 Authentication header 中提供 Azure AD username/password。我在第一个不安全的 Web API 中获取这些凭据,并尝试针对 AD 验证凭据,获取令牌。从这里开始,我将通过使用 AD 令牌发出请求来调用受 [Authorize] 保护的 Web API。

此时我使用与上面链接的示例相同的代码,只是将控制台应用程序中的代码向上移动到第一个不安全的 Web API 控制器中,但我没有运气。我在 CloudIdentity 上读到 "You can only use those flows from a native client. A confidential client, such as a web site, cannot use direct user credentials."。这是真的?如果是这样,还有另一种方法可以实现我的目标吗?我需要使用凭据,因为将来可能会有更多服务使用 API,因此每个服务都需要自己的凭据才能使用,这些凭据可以在 Azure 中进行管理。

编辑:在阅读更多相关内容时,我是否真的打算使用客户端身份验证,在 Azure AD 中创建一个 "Application",并向希望调用 [=] 的每个外部服务提供客户端 ID 26=],然后使用它而不是凭据进行身份验证?

是的,您的编辑是正确的。 Resource Owner Password Credentials grant 用于验证用户,而不是应用程序。典型用途是来自提示您输入用户名和密码然后从 Azure AD 检索令牌的应用程序。

您可以使用 Client Credentials grant to get a token from Azure AD from a confidential client to call an API without user context. This flow requires that you register the application in Azure AD and generate a key (which will be used as the client secret). You can then use the ADAL library to ge a token from AAD as shown here.