使用Active Directory的REST API的授权方法

Rob*_*boy 15 asp.net security authorization oauth angularjs

根据以下要求保护REST Web API的最佳方法是什么?该系统有一个Angular JS前端,其中包含在ASP.net中实现的REST API.

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

我相信Oauth将是我最好的选择.

小智 7

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

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

所有用户都在Active Directory中,所以如果我有一个用户名,我可以检查他们在哪个角色 - 一些客户端在Windows机箱上,其他客户端在Linux上

  • 如果您有ADFS,那么您可以拥有一个信任ADFS的Identity服务器.ADFS将提供一个令牌,该令牌将具有角色声明,并且您的Identity Server将执行声明转换,并将相同的角色声明返回给角度应用.

我想坚持会话,所以我不必为每个API调用查找AD

  • 为此,在请求令牌时,您可以请求离线范围,以便身份服务器提供Refresh Token,Access Token这样您就不需要一次又一次地请求AD.

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

  • 对于这个,您可以让Identity服务器信任WSFederation for Windows身份验证.

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


Ste*_*ane 5

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

  • 您的帐户和角色位于 Active Directory 中
  • 您想要基于 Active Directory 组管理角色
  • 您希望任何系统(Windows、Linux、Mac、移动设备...)的任何人都使用相同的身份验证连接到您的应用程序
  • 您希望避免您的广告不断受到攻击(例如,不在任何通话中)
  • 如果用户连接到使用身份验证系统的应用程序,则他不必在使用相同身份验证系统的另一个应用程序上再次执行此操作

如果这些要求是你的。我相信唯一标准(且干净)的解决方案是使用 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。这将允许您制作与 thinktecture 相同的身份服务器,但在 NodeJs 中。显然,您必须手动进行所有带有广告的接线。这样,您可以使用隐式流(不确定断言流)。

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