azure - 我可以将 MFA 应用于 Azure ADB2C 中的每个用户吗?

标签 azure azure-ad-b2c azure-ad-b2c-custom-policy

我使用自定义策略来创建登录屏幕。 我们希望在每个用户的基础上运行 MFA。 例如,我有两个用户帐户。(user1,user2) 用户 1 希望在不使用 MFA 的情况下登录。 用户 2 应用 MFA 并想要登录。 然后,两个用户访问相同的 URL 进行登录。 这样我们在哪里可以为每个用户设置MFA呢?

最佳答案

我已经能够通过自定义策略(一项用于注册,第二项用于取消注册)实现每用户 TOTP MFA 注册/取消注册的自助服务。

我的场景中的想法是,由最终用户决定是否要使用 TOTP MFA。

到目前为止,这只是一个 PoC 实现,但在我的测试过程中运行良好。

它基于 GitHub 上提供的 TOTP MFA 示例 - https://github.com/azure-ad-b2c/samples/tree/master/policies/totp .

我的用户旅程的相关部分:

  1. 启用 MFA 用户旅程
<UserJourney Id="EnableMFA" DefaultCpimIssuerTechnicalProfileReferenceId="JwtIssuer">
  <OrchestrationSteps>
    //Default steps for signing in user with Local/Social account
    [...]

    <OrchestrationStep Order="5" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="CheckAvailableDevices" TechnicalProfileReferenceId="AzureMfa-GetAvailableDevices" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <OrchestrationStep Order="6" Type="ClaimsExchange">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
          <Value>numberOfAvailableDevices</Value>
          <Value>0</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <ClaimsExchanges>
        <ClaimsExchange Id="CreateErrorResponse-MfaAlreadyEnabled" TechnicalProfileReferenceId="CreateErrorResponse-MfaAlreadyEnabled" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="ReturnOAuth2Error">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
          <Value>numberOfAvailableDevices</Value>
          <Value>0</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
    </OrchestrationStep>

    <OrchestrationStep Order="8" Type="InvokeSubJourney">
      <JourneyList>
        <Candidate SubJourneyReferenceId="TotpFactor-Input" />
      </JourneyList>
    </OrchestrationStep>

    <OrchestrationStep Order="9" Type="InvokeSubJourney">
      <JourneyList>
        <Candidate SubJourneyReferenceId="TotpFactor-Verify" />
      </JourneyList>
    </OrchestrationStep>

    <OrchestrationStep Order="10" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
  <ClientDefinition ReferenceId="DefaultWeb" />

</UserJourney>

第 5 步读取 numberOfAvailableDevices,指示用户是否已注册 (numberOfAvailableDevices=1) 或尚未注册 (numberOfAvailableDevices=0)。

如果用户已注册,则步骤 6 和 7 将创建并返回错误,以通知用户无法启用 MFA,因为它已启用。

第 8 步和第 9 步是注册用户。这些步骤取自 GitHub 示例。

  • 禁用 MFA UserJourney
  • 此处,AzureMfaProtocolProvider 技术提供商不支持取消注册 TOTP MFA。可用操作列表可以在这里找到 - https://learn.microsoft.com/en-us/azure/active-directory-b2c/multi-factor-auth-technical-profile#totp-mode .

    为了取消注册用户,您可以使用 Microsoft Graph(需要为您的 API 定制 REST 技术配置文件)。

    https://learn.microsoft.com/en-us/graph/api/resources/softwareoathauthenticationmethod?view=graph-rest-beta

    使用这些端点,您可以列出特定用户的softwareOathMethods,并根据需要删除它们。如果用户启用了 TOTP MFA,则 MS Graph 应返回一个包含 1 个 softwareOathMethod 的数组。

    用户旅程:

    <UserJourney Id="DisableMFA" DefaultCpimIssuerTechnicalProfileReferenceId="JwtIssuer">
      <OrchestrationSteps>
        //Default steps for signing in user with Local/Social account
        [...]
    
        <OrchestrationStep Order="5" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="CheckAvailableDevices" TechnicalProfileReferenceId="AzureMfa-GetAvailableDevices" />
          </ClaimsExchanges>
        </OrchestrationStep>
    
        <OrchestrationStep Order="6" Type="ClaimsExchange">
          <Preconditions>
            <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
              <Value>numberOfAvailableDevices</Value>
              <Value>0</Value>
              <Action>SkipThisOrchestrationStep</Action>
            </Precondition>
          </Preconditions>
          <ClaimsExchanges>
            <ClaimsExchange Id="CreateErrorResponse-MfaNotEnabled" TechnicalProfileReferenceId="CreateErrorResponse-MfaNotEnabled" />
          </ClaimsExchanges>
        </OrchestrationStep>
    
        <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="ReturnOAuth2Error">
          <Preconditions>
            <Precondition Type="ClaimEquals" ExecuteActionsIf="false">
              <Value>numberOfAvailableDevices</Value>
              <Value>0</Value>
              <Action>SkipThisOrchestrationStep</Action>
            </Precondition>
          </Preconditions>
        </OrchestrationStep>
    
        <OrchestrationStep Order="8" Type="InvokeSubJourney">
          <JourneyList>
            <Candidate SubJourneyReferenceId="TotpFactor-Verify" />
          </JourneyList>
        </OrchestrationStep>
    
        <OrchestrationStep Order="9" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="REST-DisableMfa" TechnicalProfileReferenceId="REST-DisableMfa" />
          </ClaimsExchanges>
        </OrchestrationStep>
    
        <OrchestrationStep Order="10" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
      <ClientDefinition ReferenceId="DefaultWeb" />
    
    </UserJourney>
    

    步骤 5,6 和 7 与前面提到的 EnableMFA UserJourney 中的相应步骤类似。

    第 8 步强制用户在禁用 MFA 之前从其身份验证器应用中输入 TOTP 代码,以便我们确定他是该帐户的所有者。

    在第 9 步中,REST-DisableMfa 技术配置文件是我的自定义 REST api,然后它调用 Microsoft Graph api。

    关于azure - 我可以将 MFA 应用于 Azure ADB2C 中的每个用户吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71382082/

    相关文章:

    javascript - CSS 或 JavaScript 如何对 Azure B2C 电子邮件验证过程的不同步骤使用react?

    azure - 自定义属性分配 Azure ADB2C

    asp.net-mvc - Azure Web 角色压力测试 - AsyncController 中的 1000 毫秒阻塞操作

    azure - 如何使用 API 配置 Azure Active Directory(作为 IDP)和企业应用程序之间的 SAML 联合?

    azure - 暂时增加 Azure 数据资源管理器中 .set 引入查询的限制

    azure - 无法在 Azure B2C 注册页面中执行注册属性的重新排序

    Azure AD B2C - 我们可以使用电子邮件 ID 而不是 UPN 登录 - 仅本地帐户自定义策略吗?

    sql-server - 通过本地计算机上的 SQL Server Management Studio 访问 Azure VM 上的 Azure SQL Server

    azure - B2C 发布范围 - "No identifier URI has been provided"

    angular - MSAL/B2C 错误 : 'Secure Connection Failed' AFTER getting valid ID token