如何使用 B2C 自定义策略将登录限制在指定的 IP 地址范围内

How to restrict a logon to a specified Ip Address Range using B2C Custom Policy

我使用 B2C 自定义策略登录用户。是否可以限制用户,使他们只能从指定的 IP 地址(或范围)登录?

目前 Azure AD B2C 中没有此类功能。您可以在 Microsoft Azure Forum 上提交反馈。

你可以尝试自己实现,请参考下面的思路。

您可以调用 REST API 并将 IP 地址传递给它。可以使用 Claims Resolver 解析 IP 地址。如果它是一个 IP 地址,那么您可以在策略中进行声明转换以检查用户 ip 是否匹配。否则,如果它需要检查 ip 范围内的用户 ip,那么您需要在 REST API.

中执行该逻辑

与此类似的方法:

https://github.com/azure-ad-b2c/samples/tree/master/policies/relying-party-rbac https://docs.microsoft.com/en-us/azure/active-directory-b2c/claim-resolver-overview

您还可以创建声明转换来检查客户端 IP 是否可信,如下所示。

  1. 创建一个声明类型,例如 clientIP,类型为 string,表示客户端的 IP:
<ClaimType Id="clientIP">
  <DisplayName>Client IP Address</DisplayName>
  <DataType>string</DataType>
</ClaimType>

还有另一种声明类型,例如 isTrustedIP,类型为 boolean,表示客户端 IP 是否为可信 IP。

<ClaimType Id="isTrustedIP">
  <DisplayName>Is Trusted IP Address</DisplayName>
  <DataType>boolean</DataType>
</ClaimType>
  1. 创建声明转换,例如 SetIsTrustedIPClaim,类型 SetClaimsIfRegexMatch that checks whether the client IP matches a trusted IP (e.g. "216.3.128.12" or any regular expression for an IP address or range) 或不创建,并因此设置 isTrustedIP 声称 truefalse:
<ClaimsTransformation Id="SetIsTrustedIPClaim" TransformationMethod="SetClaimsIfRegexMatch">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="clientIP" TransformationClaimType="claimToMatch" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="matchTo" DataType="string" Value="^216\.3\.128\.12$" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="isTrustedIP" TransformationClaimType="regexCompareResultClaim" />
  </OutputClaims>
</ClaimsTransformation>
  1. 创建 a technical profile for the claims transformation 以便可以从编排步骤调用声明转换:
<ClaimsProvider>
  <DisplayName>Claims Transformation</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="ClaimsTransformation-SetIsTrustedIPClaim">
      <DisplayName>Set Is Trusted IP Claims Transformation</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="clientIP" DefaultValue="{Context:IPAddress}" AlwaysUseDefaultValue="true" />
      </OutputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="isTrustedIP" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="SetIsTrustedIPClaim" />
      </OutputClaimsTransformations>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>
  1. 从编排步骤调用声明转换技术配置文件:
<OrchestrationStep Order="1" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="ClaimsTransformation-SetIsTrustedIPClaim" TechnicalProfileReferenceId="ClaimsTransformation-SetIsTrustedIPClaim" />
  </ClaimsExchanges>
</OrchestrationStep>

随后的编排步骤可以根据 isTrustedIP 声明是否设置为 truefalse.[=25= 来允许或拒绝访问]

您可以创建一个充当阻止页面的 selfAsserted 页面:

<TechnicalProfile Id="SelfAsserted-BlockUser">
    <DisplayName>Block page</DisplayName>
    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    <Metadata>
        <Item Key="ContentDefinitionReferenceId">api.selfasserted</Item>
        <Item Key="setting.showContinueButton">false</Item>
        <Item Key="setting.showCancelButton">false</Item>
    </Metadata>
    <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="CreateError"/>
    </InputClaimsTransformations>
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="UserMessageDenied"/>
    </InputClaims>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="UserMessageDenied" Required="true"/>
    </OutputClaims>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>
</TechnicalProfile>

创建要显示的错误消息

<ClaimsTransformation Id="CreateError" TransformationMethod="CreateStringClaim">
    <InputParameters>
        <InputParameter Id="value" DataType="string" Value="Your IP is blocked." />
    </InputParameters>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="UserMessageDenied" TransformationClaimType="createdClaim" />
    </OutputClaims>
</ClaimsTransformation>

然后从userJourney调用它来评估isTrustedIP,然后调用块页面:

<OrchestrationStep Order="3" Type="ClaimsExchange">
    <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
            <Value>isTrustedIP</Value>
            <Value>True</Value>
            <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
    </Preconditions>
    <ClaimsExchanges>
        <ClaimsExchange Id="BlockUser" TechnicalProfileReferenceId="Selfasserted-Blockuser" />
    </ClaimsExchanges>
</OrchestrationStep>

我知道这是一个旧的 post,但是有一个称为条件访问的新功能。可以在文档中找到更多详细信息。 https://docs.microsoft.com/en-us/azure/active-directory-b2c/conditional-access-technical-profile