Asp.net 使用Azure AD进行无头身份验证(用户/通行证组合)

Asp.net 使用Azure AD进行无头身份验证(用户/通行证组合),asp.net,azure,authentication,asp.net-web-api,adal,Asp.net,Azure,Authentication,Asp.net Web Api,Adal,我遵循Microsoft提供的指南和示例,我能够让演示正常工作,在控制台应用程序中进行身份验证,然后使用正确的令牌向Web API发出请求 我希望使用这个,但控制台应用程序中的代码需要移动到Web应用程序。本质上:外部服务器尝试访问安全的Web API,在HTTPS请求的身份验证头中提供Azure AD用户名/密码。我在第一个不安全的Web API中获取这些凭据,并尝试根据AD对凭据进行身份验证,从而获得令牌。从这里,我将通过使用AD令牌发出请求来调用受[Authorize]保护的Web API

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

我希望使用这个,但控制台应用程序中的代码需要移动到Web应用程序。本质上:外部服务器尝试访问安全的Web API,在HTTPS请求的
身份验证
头中提供Azure AD用户名/密码。我在第一个不安全的Web API中获取这些凭据,并尝试根据AD对凭据进行身份验证,从而获得令牌。从这里,我将通过使用AD令牌发出请求来调用受
[Authorize]
保护的Web API

此时,我正在使用与上面链接的示例相同的代码,只是将Console应用程序中的代码上移到第一个不安全的WebAPI控制器中,但我没有运气。我读到“您只能使用来自本机客户端的流。机密客户端(如网站)不能使用直接用户凭据。”。这是真的吗?如果是的话,有没有其他方法来实现我的目标?我需要使用这些凭据,因为将来可能会有更多的服务使用API,所以每个服务都需要自己的凭据才能使用,这些凭据可以在Azure中管理


编辑:在阅读更多关于此的内容时,我是否应该真正使用客户端身份验证,在Azure AD中创建一个“应用程序”,并向每个希望调用API的外部服务提供客户端ID,然后使用该ID而不是凭据进行身份验证?

是的,您的编辑是正确的。验证的目的是验证用户,而不是应用程序。典型的应用程序会提示您输入用户名和密码,然后从Azure AD检索令牌


您可以使用从保密客户端从Azure AD获取令牌,以便在没有用户上下文的情况下调用API。此流程要求您在Azure AD中注册应用程序并生成密钥(将用作客户端机密)。然后,您可以使用ADAL库从AAD获取代币,如图所示。

完美-谢谢。所以,如果我把这个例子分开,外部应用程序会向我的API发送什么,仅仅是客户端ID?或者客户端ID和应用程序机密?我应该补充一点,我知道在完美的世界中,外部应用程序会完成所有这一切,并且只发送令牌,但我不能保证外部服务器的语言能够使用Azure库,因此在调用安全API之前,需要在API中获取令牌。在这种情况下,是否只是他们将发送的客户端ID?