我使用自定义策略来创建登录屏幕。 我们希望在每个用户的基础上运行 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 .
我的用户旅程的相关部分:
- 启用 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 技术配置文件)。
使用这些端点,您可以列出特定用户的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/