如何使用OAuth 2.0通过Azure Active Directory进行用户身份验证?

16

我有一个用C#编写的REST API,并且需要使用现有的Azure AD服务进行身份验证。我目前拥有希望进行身份验证的用户的用户名和密码。我需要与Azure AD进行身份验证并从服务器接收访问令牌。

请问有人可以指引我一些解释如何完成此操作的文章/教程吗?


5
你是想了解如何在Azure AD中使用OAuth 2.0吗?具体的调用过程可以在此处找到:https://msdn.microsoft.com/en-us/library/azure/dn645543.aspx。而使用[Azure AD身份验证库](https://msdn.microsoft.com/en-us/library/azure/jj573266.aspx)则能使这个过程更加简化。 - Panagiotis Kanavos
谢谢 - 这正是我所需要的。 - COBOL
你提到用户凭据的事实让我感到紧张。你能否在问题中添加更多细节?场景是这样的吗:本地应用程序 -> 你的 REST API -> Azure AD Rest API。还是这个:Web 应用程序 -> 你的 REST API -> Azure AD Rest API。或者其他情况。根据确切的场景,我可以向你指示示例,从而避免你需要处理用户凭据,这在安全方面会更安全。 - Rich Randall
2个回答

17
请避免处理用户凭据。收集用户凭据存在严重的安全问题,使用OAuth 2.0或OpenID Connect获取令牌而不直接处理凭据可以缓解这些问题。此外,如果您拥有自己的凭据收集UI,则可能会发现,如果启用了多因素身份验证,则登录将失败。在这种情况下,可能需要比您收集的更多信息来验证用户,例如一次性密码。如果允许Azure AD通过OAuth 2.0或OpenID Connect呈现认证体验,则可以隔离所采用的特定认证方法。尽可能避免收集用户的Azure AD凭据。
我没有足够的详细信息来确信以下示例适用于哪种具体情况,但它至少提供了一个良好的起点。此示例演示了如何创建调用REST API并以最安全的方式调用Azure资源的本机应用程序。

https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet

在这里,您可以找到许多其他示例,可用于构建特定场景的解决方案。

https://github.com/AzureADSamples

如果您提供更多细节,我可以给出更具体的指导。

1
嗨,我有一个Android应用程序,它通过用户名和密码发送到我的REST API。 REST API然后需要使用现有的Azure AD服务器检查此用户名和密码组合是否正确。如果正确,则REST API将处理生成访问令牌,该应用程序将使用该令牌与我的REST API通信。 - COBOL
2
请避免传输用户名和密码。每次处理用户名和密码都是用户帐户被攻击的另一个潜在地点。从AAD返回的令牌受到特定范围的限制。如果其中一个令牌被攻击,那么威胁程度要比用户名密码被攻击小得多。为什么要直接收集用户名密码?这可以改变吗? - Rich Randall
有一些与合规性相关的情况,应用程序需要在请求中验证应用内的凭据。似乎没有其他方法可以避免这种情况,除非从客户端应用程序获取凭据,然后在服务器上(客户端应用程序中的C#)进行验证。 - mellis481
1
我想更好地了解您的合规情况。从 AAD 获取令牌意味着凭据是有效的。 - Rich Randall
不在应用程序中传输用户凭据是一个很好的观点。谢谢@RichRandall - RyanOC
不确定为什么这个被点赞了。通过给出你对问题的看法来回答问题并不是一个答案。 - David

4

1
@ivan.petrovic 资源: Web API(受保护的资源)的应用程序 ID URI。要查找 Web API 的应用程序 ID URI,请在 Azure 管理门户中单击“活动目录”,单击目录,单击应用程序,然后单击“配置”。https://azure.microsoft.com/zh-cn/documentation/articles/active-directory-protocols-oauth-code/ - sandiejat
从同一篇文章中:您只能从本机客户端使用这些流程。机密客户端,例如网站,无法使用直接用户凭据。 - Michael Freidgeim
如果您查看此问题的已接受答案:https://dev59.com/UJzha4cB1Zd3GeqPDVWw,您将了解如何构造原始POST请求以使用用户凭据获取令牌。这在任何您可以创建HttpClient对象进行请求的地方都适用... - Ian Robertson
不幸的是,此答案允许应用程序访问用户的用户名和密码...更好的方法是让凭据提供程序验证并返回令牌,应用程序可以要求提供程序验证。这样,用户的信息就保留在提供程序和用户之间。 - nmishr
在原始问题中,应用程序具有用户名和密码。 - dteviot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接