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

Posted

技术标签:

【中文标题】使用 Oauth2/OpenID 连接构建 Web-API【英文标题】:Building a Web-API with Oauth2/OpenID connect 【发布时间】:2015-11-28 17:24:01 【问题描述】:

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

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

我目前的理解是:-

    我的客户端会检测到用户未登录并重定向到登录。 用户将提供他们的凭据,并连同一个 oauth2 令牌一起被重定向回客户端。 此令牌将提供给任何请求的 web-api 端点。

这对我来说是模糊的。

我究竟如何使用此令牌来授权对特定资源的访问,确定谁在访问该资源,以及这样做的机制是什么?

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

但是...

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

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

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

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

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

    在调用服务时提供的令牌需要在传输中得到保护(因此使用 HTTPS) - 以防止 MITM。

    令牌需要以某种方式签名 - 我猜是通过使用客户端密码或其他方式 - 以防止令牌中的信息被欺骗。

谁能帮我收拾一下这个乱七八糟的烂摊子?

特别是-

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

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

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

【问题讨论】:

我建议将其分解为几个 *** 问题。 【参考方案1】:

免责声明:这不是一个全面的答案。它不在我的脑海中。

OpenID Connect 在 OAuth 之上提供了一个身份层。在您的情况下,Active Directory 提供身份验证并发回 access_token。访问令牌代表 AD 已通过身份验证的用户。如果您使用 OpenID Connect,那么 AD 还会发送一个id_token,其中可能包含其他身份信息(例如生日、头像以及 AD 公开的任何其他内容。)

OpenID Connect 和 Active Directory 都与您的应用分配给用户的角色无关;角色完全是您的应用程序的职责。您像往常一样分配用户角色;您将它们分配给nameid,而不是分配给电子邮件地址或用户名。您的应用不再需要对用户进行身份验证,但它确实需要为 nameid 分配角色。

API 调用者的身份是如何确定的 - 身份是由客户端还是服务器中的调用确定的?

身份嵌入在 AD 在其响应中包含的 access_token 中。此令牌将包含一个 nameid,您的应用可以将其与用户和角色相关联。 nameid 类似于您的应用用来识别用户的电子邮件地址、用户名或其他唯一 ID。

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

你选择。当您的应用收到带有特定access_token 的请求时,该令牌将通过其nameid 与特定用户关联,您可以为该用户分配任何角色和权限。基本上,将角色与nameid 关联。

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

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。

【讨论】:

【参考方案2】:

除了问题 #1(在服务端验证身份)之外,您的所有问题都是开放式的,需要很长的答案。 我建议阅读https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/ - 它很好地介绍了许多现代身份验证场景的底层流程,包括您关注的 Web API。 阅读完之后,您将在https://azure.microsoft.com/en-us/documentation/articles/active-directory-code-samples/ 中找到一套完整的示例——特别是,我建议您研究 Web API 并通过授权一个来找到关于您列出的 3 个问题的指导。 HTH!

【讨论】:

不!如果您想了解更多详情:cloudidentity.com/blog/2014/03/03/…

以上是关于使用 Oauth2/OpenID 连接构建 Web-API的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2/OpenID Connect 保护 API 的自动化 API 测试

使用 OAuth2/OpenId Connect 和微服务进行身份验证和授权

Keycloak 的 OAuth2 / OpenID Connect 端点是啥?

Spring Boot OAuth2/OpenID Connect Client 尝试解码 Jwt: Malformed Jwk set 时出错

OIDC-基于OAuth2的下一代身份认证授权协议

Web系统之常用单点登录协议