【问题标题】:How to add custom claims to Azure AD authenticated user in ASP.Net Core application?如何在 ASP.Net Core 应用程序中向 Azure AD 身份验证用户添加自定义声明?
【发布时间】:2021-01-01 01:25:57
【问题描述】:

我们正在使用 Angular SPA 客户端构建一个 ASP.net 核心 Web API。对于身份验证,我们已经使用多租户实现了 Azure AD。对于 Web API 身份验证/授权,我们遵循this Microsoft sample。这使用 Microsoft.Identity.Web MSAL 库来验证源自 Angular SPA 的授权代码。在 Azure AD 应用程序注册中,我们管理应用程序的正确范围,但我们无法理解如何管理声明。

在以前的应用程序中,我在我的应用程序中将身份验证服务器 IdentityServer4 作为中间件运行,从而允许在我的应用程序中进行身份验证和发出声明。我正在使用UserManager 添加或删除对用户的声明。索赔信息存储在我的数据库的用户表中,然后包含在发布的 cookie 中,可供 SPA 和 Web API 使用。

在当前的应用程序中,我们完全依赖 Azure AD,现在我觉得我在管理用户声明(以及它们包含在 cookie/令牌中)的过程中遗漏了一部分。 问题:当用户管理和身份验证发生在 Azure AD 而不是我的应用程序中时,如何管理特定于我们的应用程序的声明?

澄清一下:This Microsoft document 提到了三种使用应用程序角色的方法:Azure AD 应用程序角色、Azure AD 安全组和应用程序角色管理器。这是我认为的最后一个是我需要的正确功能:

使用这种方法,应用程序角色根本不会存储在 Azure AD 中。相反,应用程序将每个用户的角色分配存储在自己的数据库中——例如,使用 ASP.NET Identity 中的 RoleManager 类。


一小部分我已经查看但没有给我答案的文档:

  • This previously linked Microsoft document 确实提到在 ASP.NET Identity 中使用 RoleManager 类,但没有解释如何将其实现为与 Azure AD 的集成,以便 cookie/令牌包含角色(或角色转换为声明)。

  • 我已经阅读了有关使用 MS Graph schema extensionsincluding these in claims 的信息,但是,该文章还指出,任何 应用程序在同意的情况下都可以读取和写入这些扩展属性。暗示这不是向应用程序提供任何声明的安全方式,因为可以从应用程序外部触及这些值

  • Documentation 解释如何验证用户声明。

  • Tailspin scenario,提到在应用程序上使用角色而不是安全组。但没有任何迹象或暗示如何将其作为声明包含在 Azure AD 中。并且跟随this 很明显它不受应用程序的控制。

  • This documentthis 解释了转换声明或添加自定义声明,但这是用户帐户的基础条件,而不是设置声明的应用程序。这些条件也需要在域而不是应用程序中进行管理。

  • Similar question?但没有答案。

【问题讨论】:

    标签: asp.net-core azure-active-directory


    【解决方案1】:

    这个document应该是你想要的。

    您应该按照the first example 将应用角色添加到代表您的Web API(这里应该是服务应用TodoListService)的Azure AD 应用清单中。

    "appId": "8763f1c4-f988-489c-a51e-158e9ef97d6a",
    "appRoles": [
        {
          "allowedMemberTypes": [
            "User"
          ],
          "displayName": "Writer",
          "id": "d1c2ade8-98f8-45fd-aa4a-6d06b947c66f",
          "isEnabled": true,
          "description": "Writers Have the ability to create tasks.",
          "value": "Writer"
        }
      ],
    "availableToOtherTenants": false,
    

    那你需要assign users to this app role

    用户登录后,您将获得token中的app角色,您可以轻松verify它。

    HttpContext.ValidateAppRole("Writer");
    

    此应用角色特定于您的 Web API 应用。当用户登录其他应用时,应用角色Writer将不可用。

    【讨论】:

    • 感谢 Allen,在此解决方案中,角色(或声明)在 Azure AD 上进行管理。我想使用 Azure AD 进行身份验证,但在我的应用程序中管理授权(和权限分配)。我已经编辑了我的问题以澄清这一点。
    • @Superman.Lopez 很抱歉造成误解。如果是这样,我认为您需要在AAD和您自己的数据库之间实现用户信息同步。并继续使用UserManager
    【解决方案2】:

    没有代表发表评论,但我在尝试将身份验证移至 MSAL 时遇到了同样的问题。如果您遇到使用角色管理器的答案,请告诉我。

    【讨论】:

      【解决方案3】:

      在与 Microsoft Azure AD 支持讨论后,我认为这是不可能的。


      以下是我认可的替代方法。很高兴听到其他可能的情况:

      this article from Microsoft 之后,我们可以使用以下方法添加具有自定义信息的角色:

      • Azure AD 应用角色
      • Azure AD 安全组
      • 或者在应用程序中添加一个Identity,然后实现RoleManager类。这意味着应用程序数据库将持有一个身份,这在某种程度上违背了 Azure AD 的目的。

      其他信息也可以添加到 Microsoft Graph,如 rasmustherkelsen 的 blog post 中所述。但是,我认为这不适用于任何与安全相关的项目(例如权限或付费模块许可证),正如 Microsoft 在 this article 中解释的那样:

      扩展属性可由组织中任何同意的应用程序访问,而不仅仅是它们注册的应用程序。

      如果租户同意,其他应用程序可以读取和写入此属性。

      编辑:Graph API 能够更新应用程序角色。应用程序可以调用它来安全地更新应用程序角色。

      我的研究使我得出结论,多租户 SaaS 解决方案实际上无法将 Azure AD 用作唯一的身份提供者。应用程序需要提供一些身份来管理额外的声明,例如详细的应用程序权限和付费模块访问权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-27
        • 2018-07-04
        • 2022-01-20
        • 2019-09-20
        • 1970-01-01
        • 2021-10-02
        • 2022-10-25
        • 1970-01-01
        相关资源
        最近更新 更多