设置客户帐户保护
Microsoft Dynamics 365欺诈保护包括帐户保护功能,可帮助你评估业务生态系统中是否存在任何可疑活动。 这些功能包括风险评估功能,可用于阻止或质询欺诈性尝试创建帐户或损害现有帐户。 以下是一些示例:
- 用于实时风险评估的 API
- 一种规则和列表体验,可用于根据业务需求优化风险策略
- 监视可用于监视生态系统中的欺诈保护有效性和趋势的仪表板
帐户保护涵盖三种类型的帐户生命周期事件: 帐户创建、 帐户登录和 自定义评估。 对于每个事件类型,都有多个防线:
- 高效的机器人检测:当欺诈保护检测到自动尝试使用泄露的凭据列表或暴力破解来创建或修改帐户时,其第一道防线是动态且可靠的 机器人检测。 这种先进的自适应人工智能(AI)快速生成一个分数,该分数映射到机器人启动事件的概率。
- 实时强化评估:作为其下一道防线,欺诈保护使用 AI 模型生成 风险评估分数。 可以将此分数与规则一起使用,根据业务需求批准、质询、拒绝或查看登录和注册尝试。
本文档的目标
本文档将指导你完成以下活动:
-
完成这些活动后,你将能够使用帐户保护来阻止或质询可疑尝试入侵现有帐户。
先决条件
在开始本文档中的活动之前,必须完成以下任务:
- 按照“设置欺诈保护试用版”中所述 ,在 Microsoft Entra 租户中设置欺诈保护。
- 设置设备指纹。
步骤 1:实现帐户保护 API
若要利用欺诈保护中的全部功能,请将交易数据发送到实时 API。
- 在评估体验中,可以分析使用欺诈保护的结果。
- 在保护体验中,可以根据已配置的规则执行决策。
可以根据要使用欺诈保护的方式使用不同的 帐户保护 API 。 这些 API 的示例包括: AccountCreation、 AccountLogin、 AccountCreationStatus、 AccountLoginStatus、 AccountUpdate、 Label 和 自定义事件。
有关支持的事件的详细信息,请参阅 Dynamics 365欺诈保护 API。
步骤 2:创建Microsoft Entra 应用
重要
若要完成此步骤,你必须是Microsoft Entra 租户中的应用程序管理员、云应用程序管理员或全局管理员。
若要获取调用 API 所需的令牌,请使用欺诈保护来配置 Microsoft Entra 应用程序。
配置 Microsoft Entra 应用
在 欺诈保护门户中的左侧导航中,选择“ 设置”,然后选择“ 访问控制”。
选择“ 应用程序访问”。 在 “+ 分配应用程序角色” 下拉列表中,选择“ 创建新应用程序”,然后填写字段以创建应用。 需要以下字段:
应用程序显示名称 – 输入应用的描述性名称。 最大长度为 93 个字符。
身份验证方法 – 选择证书还是密码(受密码保护)用于身份验证。
- 选择“证书”,然后选择“选择文件”以上传公钥。 获取令牌时,需要匹配的私钥。
- 选择“机密”以在创建应用后自动生成密码。 机密不如证书那么安全。
从 “角色”下拉列表中选择要分配给此应用的 API 角色 。 默认情况下,已选择Risk_API角色。 可以随时编辑 API 角色。
- Risk_API – 分配Risk_API角色的 Entra 应用可以调用欺诈防护评估和观察事件 API 终结点。
- Provisioning_API – 分配Provisioning_API角色的 Entra 应用可以调用欺诈保护预配 API 终结点,从而允许创建、更新和删除非根环境。
重要
可以随时编辑现有 Entra 应用的 API 角色。 若要了解详细信息,请参阅“ 配置Microsoft Entra 应用访问 ”一文。
- 填写完字段后,选择“ 创建应用程序”。
“ 确认 ”页汇总了应用的名称和 ID,以及证书指纹或机密,具体取决于所选的身份验证方法。
重要
保存有关证书指纹或机密的信息以供将来参考。 此信息仅显示一次。
创建其他应用
可以根据需要创建任意数量的应用,以在生产环境中运行 API 调用。
- 在“应用程序访问”选项卡上,从顶部导航栏中的“分配应用程序角色”下拉列表中选择“创建新应用程序”。
- 填写字段以创建应用,然后选择“ 创建应用程序”。
调用欺诈防护实时 API
使用本节中的信息将系统与欺诈保护集成。
所需的 ID 和信息
- API 终结点 – 环境的 URI 显示在 欺诈保护仪表板上的“帐户信息 ”磁贴上。
- 目录(租户)ID – 目录 ID 是 Azure 中租户域的全局唯一标识符(GUID)。 它显示在Azure 门户和欺诈保护仪表板上的“帐户信息”磁贴上。
- 应用程序(客户端)ID – 应用程序 ID 标识为调用 API 而创建的 Microsoft Entra 应用。 可以在在API 管理页上选择“创建应用程序”后显示的确认页上找到此 ID。 稍后还可以在Azure 门户中的应用注册下找到它。 将为每个创建的应用提供一个 ID。
- 证书指纹或机密 – 可以在API 管理页上选择“创建应用程序”后显示的确认页上找到证书指纹或机密。
- 实例 ID - 实例 ID 是欺诈保护中环境的全局唯一标识符(GUID)。 它将显示在 欺诈保护仪表板上的“集成 ”磁贴中。
生成访问令牌
必须生成此令牌,并为每个 API 调用提供该令牌。 请注意,访问令牌的有效期有限。 建议缓存并重复使用每个访问令牌,直到获取新令牌。 以下 C# 代码示例演示如何使用证书或机密获取令牌。 将占位符替换为自己的信息。
证书指纹
public async Task<string> AcquireTokenWithCertificateAsync()
{
var x509Cert = CertificateUtility.GetByThumbprint("<Certificate thumbprint>");
var clientAssertion = new ClientAssertionCertificate("<Client ID>", x509Cert);
var context = new AuthenticationContext("<Authority URL. Typically https://login.microsoftonline.com/[Directory_ID]>");
var authenticationResult = await context.AcquireTokenAsync("<API endpoint>", clientAssertion);
return authenticationResult.AccessToken;
}
机密
public async Task<string> AcquireTokenWithSecretAsync()
{
var clientAssertion = new ClientCredential("<Client ID>", "<Client secret>");
var context = new AuthenticationContext("<Authority URL. Typically https://login.microsoftonline.com/[Directory_ID]>");
var authenticationResult = await context.AcquireTokenAsync("<API endpoint>", clientAssertion);
return authenticationResult.AccessToken;
}
响应
在后台,上述代码生成 HTTP 请求,并接收类似于以下示例的响应。
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: <date>
Content-Length: <content length>
{
"token_type":"Bearer",
"expires_in":"3599",
"ext_expires_in":"3599",
"expires_on":"<date timestamp>",
"not_before":"<date timestamp>",
"resource":"https://api.dfp.dynamics.com",
"access_token":"<your access token; e.g.: eyJ0eXA...NFLCQ>"
}
有关访问令牌的详细信息,请参阅以下 Azure 文档:
调用 API
- 在每个请求上传递以下必需的 HTTP 标头。
标头名称 | 标头值 |
---|---|
授权 | 对此标头使用以下格式:Bearer accesstoken 在此格式中,accesstoken 是Microsoft Entra ID 返回的令牌。 |
x-ms-correlation-id | 在一起进行的每组 API 调用上发送新的 GUID 值。 |
Content-Type | application/json |
x-ms-dfpenvid | 发送实例 ID 的 GUID 值。 |
生成基于事件的有效负载。 使用系统中的相关信息填写事件数据。
有关支持的事件的详细信息,请参阅 Dynamics 365欺诈保护 API。
合并标头(包括访问令牌)和有效负载,然后将其发送到欺诈保护终结点。 (API 终结点是环境的 URI,显示在欺诈保护仪表板上的“帐户信息”磁贴上。
有关 API 的详细信息,请参阅 Dynamics 365欺诈保护 API。
步骤 3:了解帐户保护事件
帐户创建
使用 Account Create 事件发送有关传入尝试创建新帐户的信息和上下文。 响应包含帐户创建 API 的决策。
URI: <API 终结点>/v1.0/action/account/create/<signUpId>
signUpId 的值应为每个请求唯一。 它应与以下示例中的元数据部分中的值匹配。
重要
deviceContextId 的值应与设备指纹设置中session_id的值匹配。
示例有效负载
{
"device": {
"deviceContextId": "2cf391cc-62d2-47d4-a9c1-78ec025293da",
"ipAddress": "192.168.8.214",
"provider": "DFPFingerprinting",
"externalDeviceId": "1234567890",
"externalDeviceType": "Tablet"
},
"user": {
"userId": " 00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"userType": "Consumer",
"username": "kayla@contoso.com",
"firstName": "Kayla",
"lastName": "Goderich",
"countryRegion": "US",
"zipCode": "44329",
"timeZone": "-08:00",
"language": "en-us",
"membershipId": " CC004567",
"isMembershipIdUsername": false
},
"email": [
{
"emailType": "Primary",
"emailValue": "kayla@contoso.com",
"isEmailValidated": true,
"emailValidatedDate": "2018-11-27T15:12:26.9733817-08:00",
"isEmailUsername": true
}
],
"phone": [
{
"phoneType": "Alternative",
"phoneNumber": "1-4985550190",
"isPhoneNumberValidated": true,
"phoneNumberValidatedDate": "2018-11-27T15:12:26.9739451-08:00",
"isPhoneUsername": false
}
],
"address": [
{
"addressType": "Primary",
"firstName": "Kayla",
"lastName": "Goderich",
"phoneNumber": "1-4985550190",
"street1": "0123 Bechtelar Loop",
"street2": "",
"street3": "",
"city": "Kubtown",
"state": "SC",
"district": "",
"zipCode": "44329",
"countryRegion": "US"
}
],
"paymentInstruments": [
{
"merchantPaymentInstrumentId": "6ac8406f-128a-41ce-a02d-1bbaa23fbe15",
"type": "Credit Card",
"creationDate": "2020-03-24T13:23:32.3247803-07:00",
"updateDate": "2020-03-24T13:23:32.3248203-07:00"
}
],
"ssoAuthenticationProvider": {
"authenticationProvider": "MerchantAuth",
"displayName": "Kayla Goderich"
},
"metadata": {
"signUpId": "f5085b48-0f9d-47f5-85d1-2c95e7842d39",
"customerLocalDate": "2020-02-25T15:12:26.9653975-08:00",
"assessmentType": "Protect",
"trackingId": "d65544f0-f8b4-4249-a5e0-94b32a25548f",
"merchantTimeStamp": "2020-11-27T15:12:26.9721842-08:00"
},
"name": "AP.AccountCreation",
"version": "0.5"
}
帐户登录
使用帐户登录事件发送有关传入尝试创建新帐户登录名的信息和上下文。 响应包含帐户登录 API 的决定。
URI: <API 终结点>/v1.0/action/account/login/<userId>
userId 的值必须与有效负载中的值匹配。 每个用户必须具有唯一值。 此处可以使用 GUID 值。
重要
deviceContextId 的值应与设备指纹设置中session_id的值匹配。
示例有效负载
{
"device": {
"deviceContextId": "2ef10376-2ba8-4f36-a911-da438e5e5e27",
"ipAddress": "192.168.8.214",
"provider": "DFPFingerprinting",
"externalDeviceId": "1234567890",
"externalDeviceType": "Computer"
},
"user": {
"userId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"userType": "Consumer",
"username": "kayla@contoso.com",
"firstName": "Kayla",
"lastName": "Goderich",
"countryRegion": "US",
"zipCode": "44329",
"timeZone": "-08:00",
"language": "en-us",
"membershipId": "CC004567",
"isMembershipIdUsername": false
},
"recentUpdate": {
"lastPhoneNumberUpdateDate": "2018-11-127T15:22:42.3412611-08:00",
"lastEmailUpdateDate": "2018-11-127T15:22:42.3412611-08:00 ",
"lastAddressUpdateDate": "2018-11-127T15:22:42.3412611-08:00",
"lastPaymentInstrumentUpdateDate": "2018-11-127T15:22:42.3412611-08:00"
},
"ssoAuthenticationProvider": {
"authenticationProvider": "MerchantAuth",
"displayName": "Kayla Goderich"
},
"metadata": {
"LogInId": "a15d4a5d-fadc-49ab-8022-712fec597e22",
"customerLocalDate": "2020-02-25T15:22:42.3397533-08:00",
"assessmentType": "Protect",
"trackingId": "a14ebdca-9447-49b4-951e-26f6ccc4445c",
"merchantTimeStamp": "2020-11-27T15:22:42.3405921-08:00"
},
"name": "AP.AccountLogin",
"version": "0.5"
}
帐户创建状态
使用帐户创建状态事件发送有关传入尝试创建新帐户状态的信息和上下文。 响应包含帐户创建状态 API 的决定。
URI: <API 终结点>/v1.0/observe/account/create/status/<signUpId>
userId 的值必须与有效负载中的值匹配。 每个用户必须具有唯一值。 此处可以使用 GUID 值。
示例有效负载
{
"metadata":{
"signUpId":"a6221a3f-c38c-429e-8fde-3026d8c29ed3",
"userId":"11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"trackingId":"697a6bee-2d30-4132-92a6-c137aaf49c0a",
"merchantTimeStamp":"2020-04-03T13:23:32.3226335-07:00"
},
"statusDetails":{
"statusType":"Rejected",
"reasonType":"ChallengeAbandoned",
"challengeType":"Email",
"statusDate":"2020-04-03T13:23:32.3817714-07:00"
},
"name":"AP.AccountCreation.Status",
"version":"0.5"
}
帐户登录状态
使用帐户登录状态事件发送有关传入尝试创建新帐户登录状态的信息和上下文。 响应包含帐户登录状态 API 的决定。
URI: <API 终结点>/v1.0/observe/account/login/status/<userId>
signUpId 的值必须与有效负载中的值匹配。 每个属性必须具有唯一值。 此处可以使用 GUID 值。
示例有效负载
{
"metadata":{
"loginId":"dc4ea331-a6e5-4aa0-8eba-16b4d516a07d",
"userId":"11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"trackingId":"dcd65c87-d3db-4a42-8ed3-3e59f443b994",
"merchantTimeStamp":"2020-04-03T13:23:32.3759321-07:00"
},
"statusDetails":{
"statusType":"Rejected",
"reasonType":"ChallengeAbandoned",
"challengeType":"Email",
"statusDate":"2020-04-03T13:23:32.3884589-07:00"
},
"name":"AP.AccountLogin.Status",
"version":"0.5"
}
标签
除了通知虚拟欺诈分析师和监视功能的数据外,使用 Label 事件将其他信息发送到欺诈保护。 Label API 提供了基于一组附加欺诈信号的模型训练的其他信息。 它还发送有关交易、帐户或付款方式详细信息以及逆转的信息。
URI: <API 终结点>/v1.0/label/account/create/<userId>
userId 的值必须与相应的帐户登录 API 中的值匹配。
示例有效负载
{
"metadata": {
"name": "AP.Label.Metadata",
"userId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"merchantTimeStamp": "2020-06-14T21:53:27.8822492-08:00",
"trackingId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
},
"label": {
"eventTimeStamp": "2020-02-21T21:53:27.8822492-08:00",
"labelObjectType": "Account",
"labelObjectId": "userid",
"labelSource": "ManualReview",
"labelState": "AccountCompromised",
"labelReasonCode": "AccountFraud"
},
"name": "AP.Label",
"version": "0.5"
}
public enum LabelObjectTypeName
{
Purchase,
AccountCreation,
AccountLogin,
AccountUpdate,
CustomFraudEvaluation,
Account,
PaymentInstrument,
Email
}
public enum LabelSourceName
{
CustomerEscalation,
Chargeback,
TC40_SAFE,
ManualReview,
Refund,
OfflineAnalysis,
AccountProtectionReview
}
public enum LabelStateName
{
InquiryAccepted,
Fraud,
Disputed,
Reversed,
Abuse,
ResubmittedRequest,
AccountCompromised,
AccountNotCompromised
}
public enum LabelReasonCodeName
{
ProcessorResponseCode,
BankResponseCode,
FraudRefund,
AccountTakeOver,
PaymentInstrumentFraud,
AccountFraud,
Abuse,
FriendlyFraud,
AccountCredentialsLeaked,
PassedAccountProtectionChecks
}
祝贺你! 你已成功完成培训,并已准备好使用欺诈保护的帐户保护功能。
后续步骤
有关如何访问和使用其他欺诈保护功能的信息,请参阅以下文档: