利用 Active Directory 的 REST API 授权方法

Posted

技术标签:

【中文标题】利用 Active Directory 的 REST API 授权方法【英文标题】:Authorization method for REST API utilising Active Directory 【发布时间】:2017-02-08 03:21:59 【问题描述】:

保护具有以下要求的 REST Web API 的最佳方法是什么。该系统有一个 Angular JS 前端,带有在 ASP.net 中实现的 REST API。

系统中有两个“角色”,用户将拥有一个 角色。一个角色应该允许访问某些 API(称之为“VIEW”), other 角色允许访问其他 API 所有用户都在 Active Directory 中,所以如果我有用户名,我可以检查他们的角色 - 一些客户端在 Windows 机器上,其他客户端在 Linux 上 我想保持会话,这样我就不必为每个 API 调用查找 AD 我想要单点登录。在 Windows 机器上,我不需要他们输入用户并通过,因为我已经可以使用 Windows 身份验证检索他们的用户名。

我相信 Oauth 将是我的最佳选择。

【问题讨论】:

你能说一下你期待什么样的细节吗? 【参考方案1】:

我不确定您的确切期望。无论如何,首先我将根据要求重新表述您的问题:

您的帐户和角色位于活动目录中 您希望基于 Active Directory 组管理角色 您希望任何系统(windows、linux、mac、mobile...)的任何人都使用相同的身份验证连接到您的应用程序 您希望避免您的 AD 经常被击中(例如,不是在任何呼叫中) 如果用户在使用身份验证系统的应用程序上连接,他不必在使用相同身份验证系统的另一个应用程序上再次这样做

如果这些要求是您的。我相信唯一标准(和干净)的解决方案是使用 OAuth。我不会详细描述 OAuth,但这个身份验证协议是网络上最标准的协议(facebook、google、twitter ......)。当然,由于您不想在业务应用程序中使用 facebook、google 或 twitter 帐户,但您的 Active Directory 帐户必须使用 Active Directory 服务器的帐户来安装/设置/开发您的 OAuth 身份提供程序。您的选择将取决于您对 ADFS 协议及其不同流程(代码、隐式、断言)的了解程度。您有两种解决方案:

使用 ADFS:安装 ADFS;它提供了一个 OAuth 门户,可以与 asp.net mvc 一起使用。这使用 OAuth 的代码流,它是 ADFS 支持的唯一 OAuth 流。对于角色及其相关的 AD 组,您必须将角色声明与 AD 组映射。 (它在 adfs 的设置中,你会在网上找到很多教程)。您还会发现很多关于如何将 ADFS 与 asp.net mvc/asp.net webapi 一起使用的教程。我在这里提到了 .net,但每种技术都有 OAuth 身份验证的实现(nodeJs/express、php、java...)。 使用 thinktecture 身份服务器(.net 技术)。这将为以最少的努力实现自定义身份服务器提供所有基础:http://www.thinktecture.com/identityserver/https://github.com/IdentityServer/IdentityServer3。它包含一个插件,可将其帐户插入活动目录。有了这个,您可以使用隐式和断言流。 使用 oauth2orize(用于 nodeJs):https://www.npmjs.com/package/oauth2orize。这将允许您在 nodeJs 中制作与 thinktecture 身份服务器相同的内容。显然,您必须手动使用广告进行所有接线。有了这个,您可以使用隐式流(不确定断言流)。

在应用程序方面,大多数框架都可以使用 OAuth 与许多现有框架轻松进行身份验证。例如,即使您制作单页应用程序,如果您使用 angular,您也可以使用 adal.js 或 oidc.js 进行 angular。正如我上面提到的,所有这些都由开箱即用的 asp.net mvc/webapi 负责,但我知道其他服务器技术也是如此。如果您还有其他问题,请不要犹豫,因为我不确定您的确切期望。

【讨论】:

对这篇文章的补充。 ADFS 2016(或 4.0)支持完整的 OAuth/OpenIDConnect 堆栈,并且可以在没有 Identity Server 的情况下工作。 @SamuelDMSFT 确实你是对的,我忘记了这个细节。为了明确 Robben_Ford_Fan_boy,如果您安装了 ADFS 4.0,则名义上的情况下不需要 Thinktecture 身份服务器。如果您想在身份验证和授权中进行一些自制自定义,它仍然会非常有用,特别是如果您想使用更多声明自定义令牌(有时获得有关连接用户的更多信息可能很有用)。 你能给我更多关于你正在寻找的其他自定义的信息吗?【参考方案2】:

系统中有两个“角色”,用户将拥有其中一个角色。 一个角色应该允许访问某些 API(称之为“VIEW”),另一个角色应该允许访问某些 API(称之为“VIEW”) 角色允许访问其他 API

对于基于角色的身份验证,您可以使用 [Authorize("Role" = "Manager")]。令牌将由身份服务器提供,并将包含作为角色的声明。

所有用户都在 Active Directory 中,所以如果我有用户名,我可以 检查他们的角色 - 一些客户端在 Windows 盒子上, 其他人在 Linux 上

如果您有 ADFS,那么您可以有一个信任 ADFS 的身份服务器。 ADFS 将提供一个令牌,该令牌将具有角色声明,您的身份服务器将进行声明转换并将相同的角色声明返回给 Angular 应用程序。

我想保持会话,这样我就不必查找 AD 每次 API 调用

为此,在请求令牌时,您可以请求离线范围,以便身份服务器将提供 Refresh TokenAccess Token,因此您无需一次又一次地请求 AD。

我想要单点登录。在 Windows 机器上,我不需要 他们输入用户并通过,因为我已经可以检索他们的用户名 使用 Windows 身份验证。

对于这个,您可以让您的身份服务器信任 WSFederation for windows 身份验证。

因此,基本上您需要设置身份服务器,该服务器将为您提供令牌,REST API 将使用该令牌来验证声明以将正确的信息返回给用户。

【讨论】:

以上是关于利用 Active Directory 的 REST API 授权方法的主要内容,如果未能解决你的问题,请参考以下文章

Active Directory管理帮助台

.NET 中的用户组和角色管理与 Active Directory

学习总结-Active Directory 域服务管理09-DNS集成

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

powershell 用于将Active Directory组添加到Active Directory的Powershell脚本

Active Directory 和 Active Directory LDS 中的字段