我试图从概念上和实践上理解如何利用 Azure AD 在我的 web-api 应用程序中使用 openID-connect 流执行 oauth2。
重要的是,当向 API 发出请求时,我想知道是谁发出了请求。
我目前的理解是:-
- 我的客户端会检测到用户未登录并重定向到登录状态。
- 用户将提供其凭据,并连同 oauth2 token 一起重定向回客户端。
- 此 token 将提供给任何请求的 Web-API 端点。
这对我来说是个模糊的地方。
我到底如何使用此 token 来授权对特定资源的访问,确定谁正在访问该资源,以及执行此操作的机制是什么?
我有点假设我需要重用 token 来调用 Azure AD 用户端点 - 如果 token 确实有效,AD 端点将返回用户详细信息 - 从而提供一些确定方法 token 有效并提供有关用户身份的详细信息。可以通过 Azure AD 中的组成员身份来授权对资源的访问。
但是...
我只能假设这是一个已解决的问题,并且注意到根据此示例使用了 OWIN 中间件
https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet
但我仍然不太确定到底发生了什么。
该服务提到了范围和声明,但我不明白它们是从哪里派生的(我假设来自客户端提供的 token ,但不确定)。该服务必须在调用中接收身份信息。
这让我想到两点,为了保证这一点 -
调用服务时提供的 token 需要在传输过程中得到保护(因此使用 HTTPS)——以防止 MITM。
token 需要以某种方式进行签名 - 我猜是使用客户端 key 或其他东西 - 以防止 token 中的信息被欺骗。
有人可以帮我清理这个困惑的局面吗?
特别是 -
如何确定 API 调用者的身份 - 身份是通过客户端还是服务器中的调用来确定?
如何根据用户角色限制对 API 某些端点的访问?
我该如何通过构建可用的现有中间件和库来实际实现这一目标?
最佳答案
免责声明:这不是一个全面的答案。它超出了我的想象。
OpenID Connect 在 OAuth 之上提供身份层。在您的情况下,Active Directory提供身份验证并发回access_token
。访问 token 代表 AD 已验证的用户。如果您使用 OpenID Connect,那么 AD 还将发送一个 id_token
,其中可能包含其他身份信息(例如生日、头像以及 AD 公开的任何其他信息。)
OpenID Connect 和 Active Directory 都与您的应用分配给用户的角色无关;角色完全是您应用程序的管辖范围。您可以像平常一样分配用户角色;您可以将它们分配给nameid
,而不是电子邮件地址或用户名。您的应用不再需要对用户进行身份验证,但需要为 nameid
分配角色。
How is the identity of the API caller determined - is identity determined from a call in the client or the server?
身份嵌入在 AD 响应中包含的 access_token
中。此 token 中将包含一个 nameid
,您的应用可以将其与用户和角色关联。 nameid
就像电子邮件地址、用户名或您的应用用来识别用户的其他唯一 ID。
How to limit access to some endpoints of the API based on a user role?
你选择。当您的应用收到带有特定 access_token
的请求时,该 token 将通过其 nameid
与特定用户关联,您可以为该用户分配任何角色和权限。基本上,将角色与 nameid
相关联。
What do I do to practically achieve this by building on existing middleware and libraries available to me?
There is an unfinished demo here ,尽管它不使用 Active Directory 作为提供程序,而是使用内部提供程序。对于演示,用户名是 shaun
,密码是 Testing123!
。 The source code is here 。
这里是the link to the source of another demo但同样,它不使用 Active Directory 作为提供程序,而是使用 Twitter。
OAuth 和 OpenID Connect 的好处是我们可以使用我们想要的任何身份提供商,因此您可以调整演示以使用 Active Directory。
关于azure - 使用 Oauth2/OpenID 连接构建 Web-API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32366085/