Azure Active Directory B2C自定义验证

时间:2017-08-23 16:49:15

标签: azure-ad-b2c

如何在AAD B2C流程中对用户进行自定义验证?

即。 我们有一个具有各种属性的用户数据库 我们想使用B2C进行用户身份验证 我们需要确保用户注册正确匹配数据库中的现有用户 他们可以访问敏感信息,因此这非常重要 在注册过程中,我们希望让用户填写他们的详细信息,但我们需要能够根据我们的数据库检查其中的一些细节,如果他们没有正确完成详细信息,则无法注册。 例如。匹配DoB,社会安全号码,地址等。

这是实现我们想法的正确方法吗? https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-rest-api-validation-custom

如果验证失败会怎样? AAD帐户会被删除吗? 验证被放弃后会发生什么? B2C中存在“首次登录”标志,如果验证失败并且用户重试,该标志如何设置以及谁控制它会发生什么?

2 个答案:

答案 0 :(得分:1)

或者,您可以创建验证技术配置文件,该配置文件封装了由帐户注册技术配置文件执行的属性验证。

例如,您可能具有以下技术配置文件,该配置文件使用社会安全号码注册本地帐户:

<TechnicalProfile Id="LocalAccount-Registration">
  <DisplayName>Local Account Registration</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.localaccount.registration</Item>
    <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
    <Item Key="language.button_continue">Create</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="TokenSigningKeyContainer" />
  </CryptographicKeys>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="displayName" Required="true" />
    <OutputClaim ClaimTypeReferenceId="extension_SocialSecurityNumber" Required="true" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" />
    <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
    <OutputClaim ClaimTypeReferenceId="newUser" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AzureFunctions-CheckCustomer" />
    <ValidationTechnicalProfile ReferenceId="AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExists" />
  </ValidationTechnicalProfiles>
  <UseTechnicalProfileForSessionManagement ReferenceId="SSOSession-AzureActiveDirectory" />
</TechnicalProfile>

第一个验证技术配置文件名为“AzureFunctions-CheckCustomer”,在最终用户提交注册表单时执行,调用Azure功能(或其他外部服务)来验证注册字段。

<TechnicalProfile Id="AzureFunctions-CheckCustomer">
  <DisplayName>Check Customer Azure Function</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="ServiceUrl">https://contoso.azurewebsites.net/api/CheckCustomer?code=...</Item>
    <Item Key="AuthenticationType">None</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_SocialSecurityNumber" PartnerClaimType="socialSecurityNumber" />
  </InputClaims>
  <UseTechnicalProfileForSessionManagement ReferenceId="SSOSession-Noop" />
</TechnicalProfile>

如果Azure功能返回200 OK,则下一个名为“AzureActiveDirectoryStore-WriteUserByEmail-ThrowIfExists”的验证技术配置文件将创建本地帐户,最终用户可以继续执行下一步。如果Azure功能返回409冲突并显示错误消息,则不会创建本地帐户,并且会向最终用户显示错误消息。

答案 1 :(得分:0)

  

这是实现我们想法的正确方法吗? https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-rest-api-validation-custom

是的,这是正确的。

  

如果验证失败会怎样? AAD帐户会被删除吗?如果放弃验证会发生什么?

该帐户不会被删除。一种方法是添加additional attribute/claim并在您的应用中检查该值。像!IsValidated这样的东西。如果Edit Profile将用户从Edit Profile发送给他们进行验证。

IsValidated用户旅程中,如果用户输入更正的值,则true设置为 public static boolean PermissionCheck(Activity context, String permission, int code) { boolean state = false; int permissionCheck = ContextCompat.checkSelfPermission(context, permission); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(context, new String[]{permission}, code); // define this constant yourself } else { // you have the permission return true; } return state; } case CAPTURE_AUDIO_OUTPUT_CONSTANT: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Logger.e("CAPTURE PERMISSION GRANTED"); INIT(); } else { Logger.e("CAPTURE PERMISSION NOT GRANTED"); finish(); } return; }