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

Posted

技术标签:

【中文标题】如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?【英文标题】:How to authenticate user with Azure Active Directory using OAuth 2.0? 【发布时间】:2015-04-19 06:58:53 【问题描述】:

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

有人可以向我指出一些解释如何做到这一点的文章/教程的方向吗?

【问题讨论】:

您的意思是如何将 OAuth 2.0 与 Azure AD 结合使用?逐个呼叫过程描述为here。 Azure AD Authentication Library 简化了这个过程 谢谢 - 这正是我所需要的 您提到拥有用户凭据的事实让我感到紧张。您能否为您的问题添加更多细节。场景是:本机应用程序 -> 你的 REST API -> Azure AD Rest API。或者是:Web 应用程序 -> 你的 REST API -> Azure AD Rest API。或者是其他东西。根据具体情况,我可以为您指出一些示例,这些示例将阻止您处理用户凭据,从安全角度来看,这会更安全。 【参考方案1】:

见:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/

总结: 创建用户凭据

UserCredential uc = new UserCredential(user, password);

使用 UserCredential 调用 AcquireToken() 函数之一

public AuthenticationResult AcquireToken(string resource, string clientId, UserCredential userCredential);
public Task<AuthenticationResult> AcquireTokenAsync(string resource, string clientId, UserCredential userCredential);

【讨论】:

@ivan.petrovic 资源: Web API(安全资源)的应用 ID URI。要查找 Web API 的 App ID URI,请在 Azure 管理门户中单击 Active Directory,单击目录,单击应用程序,然后单击配置。 azure.microsoft.com/en-us/documentation/articles/… 来自同一篇文章:您只能使用来自 native 客户端的这些流。机密客户端(例如网站)不能使用直接用户凭据。 如果您查看有关此问题的已接受答案:***.com/questions/40498384/…,您会看到如何构建 RAW POST 请求以使用用户凭据获取令牌。这适用于您可以创建 HttpClient 对象以发出请求的任何地方... 不幸的是,这个答案允许应用程序访问用户的用户名和密码。更好的方法是让凭证提供者验证并返回应用程序可以要求提供者验证的令牌.这样,用户的信息就停留在提供者和用户之间。 @nmishr 在原始问题中应用程序具有用户名和密码。【参考方案2】:

您应该避免处理用户凭据。收集用户凭据时存在严重的安全隐患,这些凭据通过使用 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

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

【讨论】:

嗨,我有一个 android 应用程序,它通过用户名和密码发送到我的 REST API。然后,REST API 需要使用现有 Azure AD 服务器检查此用户名和密码组合是否正确。如果正确,REST API 将处理生成访问令牌,应用程序将使用该令牌与我的 REST API 进行通信。 请避免传输用户名和密码。您处理用户名和密码的任何地方都是用户帐户被盗的另一个潜在位置。从 AAD 返回的令牌被限制在特定范围内。如果这些令牌之一被泄露,则泄露的严重性远低于泄露的用户名密码。为什么要直接收集用户名密码?这个可以改吗? 在某些与合规性相关的情况下,应用需要在应用内验证请求的凭据。如果不从客户端应用程序获取凭据,然后在服务器上使用 Azure 进行验证(客户端应用程序中的 C#),似乎没有办法解决这个问题。 我想更好地了解您的合规情况。从 AAD 获取令牌意味着凭据有效。 关于不在您的应用程序中传输用户凭据的要点。谢谢@RichRandall

以上是关于如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 2.0 中使用带有身份模型的 Azure Active Directory OAuth

使用 Azure AD 承载令牌时身份验证失败,返回容器列表 [Azure Blob] [Azure AD OAuth 2.0] [REST API]

如何在 JMeter 中进行 OAuth 2.0 身份验证?

如何在 .netframework API 中使用 OAuth 2.0 On-Behalf-Of

通过第三方服务授权后,如何使用 OAuth 2.0 保持会话? [关闭]

ASP.NET Web APP 和 Web API 无限重定向循环中的 Azure AD Open ID Connect OAuth 2.0