azure - 使用 Oauth2/OpenID 连接构建 Web-API

标签 azure oauth-2.0 asp.net-web-api2 owin openid-connect

我试图从概念上和实践上理解如何利用 Azure AD 在我的 web-api 应用程序中使用 openID-connect 流执行 oauth2。

重要的是,当向 API 发出请求时,我想知道是谁发出了请求。

我目前的理解是:-

  1. 我的客户端会检测到用户未登录并重定向到登录状态。
  2. 用户将提供其凭据,并连同 oauth2 token 一起重定向回客户端。
  3. 此 token 将提供给任何请求的 Web-API 端点。

这对我来说是个模糊的地方。

我到底如何使用此 token 来授权对特定资源的访问,确定谁正在访问该资源,以及执行此操作的机制是什么?

我有点假设我需要重用 token 来调用 Azure AD 用户端点 - 如果 token 确实有效,AD 端点将返回用户详细信息 - 从而提供一些确定方法 token 有效并提供有关用户身份的详细信息。可以通过 Azure AD 中的组成员身份来授权对资源的访问。

但是...

我只能假设这是一个已解决的问题,并且注意到根据此示例使用了 OWIN 中间件

https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet

但我仍然不太确定到底发生了什么。

该服务提到了范围和声明,但我不明白它们是从哪里派生的(我假设来自客户端提供的 token ,但不确定)。该服务必须在调用中接收身份信息。

这让我想到两点,为了保证这一点 -

  1. 调用服务时提供的 token 需要在传输过程中得到保护(因此使用 HTTPS)——以防止 MITM。

  2. token 需要以某种方式进行签名 - 我猜是使用客户端 key 或其他东西 - 以防止 token 中的信息被欺骗。

有人可以帮我清理这个困惑的局面吗?

特别是 -

  1. 如何确定 API 调用者的身份 - 身份是通过客户端还是服务器中的调用来确定?

  2. 如何根据用户角色限制对 API 某些端点的访问?

  3. 我该如何通过构建可用的现有中间件和库来实际实现这一目标?

最佳答案

免责声明:这不是一个全面的答案。它超出了我的想象。

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/

相关文章:

Azure WebApp 容器和 AppSettings/环境变量

c# - Azure 解决方案设计指南

azure - 使用 UPN(用户主体名称)通过 Azure AD 进行身份验证

c# - 使用本地帐户使用安全的 ASP Net 5 web api

java - Spring Boot Security如何检查/验证访问 token

asp.net - ASP.NET Web API默认登录页面

oauth-2.0 - 覆盖AccessTokenExpireTimeSpan

node.js - 如何在 Node.js 中的 azure Active Directory 上获取登录用户的 token

Azure Function 部署时未绑定(bind)到应用程序设置

c# - 使用单个身份验证层对多个 WebAPI 进行身份验证