使用 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 时出错