使用Azure AD保护aspnet webapi

时间:2018-02-20 14:32:05

标签: oauth-2.0 azure-active-directory

我正在编写一个应用程序,它将作为反应网站的后端。该网站将由我们的客户使用,但我们将完全控制用户的权限。我们已决定使用Azure AD来保护请求,但也会公开API以供最终用户直接使用。

我的理解是在Azure AD中我将不得不创建一个允许基于Web的隐式身份验证(针对react站点)的应用程序,以及允许基于dameon的应用程序对API进行身份验证的本机应用程序。 / p>

我相信这意味着我的申请中会有两个受众群体。

我试图获得包含群组的声明,我可以看看我是否编辑了azure AD中两个应用程序的元数据以包含"groupMembershipClaims": "SecurityGroup"我可以获得包含组ID的声明,但是没有名字。

我想我也可以使用appRoles来设置应用程序使用的角色,但我还没有将其作为JWT中的声明来实现,但我认为它可以是完成后,我需要在每个应用程序上设置角色,然后将用户添加两次,这不是非常理想的。我也认为,因为我的应用是多方面的,外部用户可以使用它来设置自己的权限,这不是我想要做的。

对不起,我只是完全迷失了,而且由于这种情况发生了多大的变化,文档也不会引起混淆!

TLDR:我是否需要在azure广告中配置两个应用程序,如果是这样,最好的方式是设置权限(声明)。 oAuth 2也是正确的选择,或者我应该看看开放的id?

2 个答案:

答案 0 :(得分:1)

马上我要解决一个误会。 守护程序应用程序通常必须注册为Web / API,即publicClient:false。 那是因为本机应用程序不能拥有客户机密。 当然守护进程无法在用户的设备上运行。 因为这是一个本机应用程序。在用户设备上运行的应用程序。

  

我相信这意味着我的申请中会有两个受众群体。

至少你会有两个应用程序。如果需要,后端和React前端可以共享一个应用程序(启用隐式流程)。守护进程需要另外注册。

  

我正试图获得包括群组的声明,我可以看看我是否编辑了azure AD中两个应用程序的元数据以包含“groupMembershipClaims”:“SecurityGroup”我可以获得包含组ID的声明,但是没有名字。

是的,仅包含ID。如果您需要名称,请转到Graph API来获取它们。但你为什么需要它们呢?用于展示?否则,您需要使用ID来设置权限。名称总是会改变,然后代码就会中断。

  

我想我也可以使用appRoles来设置应用程序使用的角色,但是我还没有将它作为JWT中的声明来实现,但我认为它可以完成,但是我需要在每个应用程序上设置角色,然后将用户添加两次,这不是很理想。我也认为,因为我的应用是多方面的,外部用户可以使用它来设置自己的权限,这不是我想要做的。

您对多租户方案的想法是正确的。如果你确实想要实现这些,我就它做了一篇文章:https://joonasw.net/view/defining-permissions-and-roles-in-aad

为什么您需要在多个应用中设置角色?他们不会只在网络应用程序中申请吗? 如果本机应用程序是守护程序,则没有用户。

总的来说,我可以看到你的问题。您有来自其他组织的人员,他们想要访问您的应用程序,但您想要控制他们的访问权限。

老实说,最好的方法可能是在您控制的某个租户中使应用程序成为单租户。然后邀请外部用户作为访客(这里有一个API)。然后,您可以使用组或appRoles为其分配角色。

如果我误解了某些内容,请发表评论,我会解决问题。

答案 1 :(得分:0)

Azure AD当然是一个功能强大的系统,但我发现OAuth方面令人困惑,因为这些方面非常混乱:

  • 基于标准的OAuth 2.0和Open Id Connect
  • Microsoft供应商特定行为

与角色相关的答案

这不是我所了解的一个领域 - Juunas似乎是一个帮助你的好人。

OAUTH STANDARDS AND AZURE

我一直在努力寻找基于OAuth博客的教程我写作。也许我学到和写的一些东西对你有用。

AZURE SPA和API代码示例

我的示例演示了如何使用SPA中的隐式流通过Azure AD登录用户,然后如何在自定义API中验证收到的令牌:

不确定这与您的用例有多大关系,但我希望它对技术方面有所帮助......