You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure B2C自定义策略中按语言配置SendGrid模板ID失败求助

Azure B2C自定义策略本地化SendGrid模板ID问题修复

问题出在哪

你当前的配置有两个关键错误:

  1. 直接在InputParameter里写本地化字符串ID:GenerateJson转换的InputParameter没法直接读取本地化的FormatLocalizedStringTransformationClaimType值,必须先通过声明(ClaimType)来中转。
  2. 没做本地化值到声明的转换:缺少专门的ClaimsTransformation把本地化的模板ID赋值给声明,导致SendGridTemplateId只是个字符串,没被解析成实际的模板ID。

一步步改

1. 先定义SendGridTemplateId声明类型

在策略的<ClaimsSchema>节点里加这段:

<ClaimType Id="SendGridTemplateId">
  <DisplayName>SendGrid模板ID</DisplayName>
  <DataType>string</DataType>
</ClaimType>

2. 加个转换把本地化值注入声明

新增一个FormatLocalizedString类型的ClaimsTransformation,用来把本地化的模板ID放到上面的声明里:

<ClaimsTransformation Id="SetSendGridTemplateId" TransformationMethod="FormatLocalizedString">
  <InputClaims />
  <InputParameters>
    <InputParameter Id="stringId" DataType="string" Value="SendGridTemplateId" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="SendGridTemplateId" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

3. 修改生成邮件请求体的转换

把原来的template_id InputParameter换成InputClaim,引用刚才定义的声明:

<ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.to.0.email" />
    <InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="personalizations.0.dynamic_template_data.subject" />
    <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="personalizations.0.dynamic_template_data.otp" />
    <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.dynamic_template_data.email" />
    <InputClaim ClaimTypeReferenceId="message" TransformationClaimType="personalizations.0.dynamic_template_data.message" />
    <InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="personalizations.0.dynamic_template_data.codeIntro" />
    <InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="personalizations.0.dynamic_template_data.signature" />
    <!-- 新增模板ID的输入声明 -->
    <InputClaim ClaimTypeReferenceId="SendGridTemplateId" TransformationClaimType="template_id" />
  </InputClaims>
  <InputParameters>
    <!-- 删除原来的template_id参数 -->
    <InputParameter Id="from.email" DataType="string" Value="myemail@blabla.com" />
    <InputParameter Id="personalizations.0.dynamic_template_data.subject" DataType="string" Value="Contoso account email verification code"/>
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

4. 更新邮件发送的TechnicalProfile

在调用SendGrid的TechnicalProfile里,先执行SetSendGridTemplateId,再执行生成请求体的转换:

<TechnicalProfile Id="Custom-SendGrid-Email">
  <DisplayName>SendGrid邮件发送</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://api.sendgrid.com/v3/mail/send</Item>
    <Item Key="AuthenticationType">Bearer</Item>
    <Item Key="SendClaimsIn">Body</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_SendGridApiKey" />
  </CryptographicKeys>
  <InputClaimsTransformations>
    <!-- 先设置本地化模板ID -->
    <InputClaimsTransformation ReferenceId="SetSendGridTemplateId" />
    <!-- 再生成邮件请求体 -->
    <InputClaimsTransformation ReferenceId="GenerateEmailRequestBody" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="emailRequestBody" PartnerClaimType="" />
  </InputClaims>
</TechnicalProfile>

5. 确认本地化资源关联对了

确保你的<Localization>节点已经在RelyingParty或TechnicalProfile里引用了对应语言的资源,比如:

<RelyingParty>
  <DefaultUserJourney ReferenceId="SignUpOrSignIn" />
  <Localization Enabled="true">
    <SupportedLanguages>
      <SupportedLanguage>en</SupportedLanguage>
      <!-- 加其他需要支持的语言,比如中文 -->
      <SupportedLanguage>zh-CN</SupportedLanguage>
    </SupportedLanguages>
    <LocalizedResourcesReferences>
      <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
      <LocalizedResourcesReference Language="zh-CN" LocalizedResourcesReferenceId="api.custom-email.zh-CN" />
    </LocalizedResourcesReferences>
  </Localization>
</RelyingParty>

最后检查

  • 每个语言的<LocalizedResources>里都要对应定义SendGridTemplateId,比如中文:
    <LocalizedResources Id="api.custom-email.zh-CN">
      <LocalizedStrings>        
        <LocalizedString ElementType="FormatLocalizedStringTransformationClaimType" StringId="SendGridTemplateId">d-中文模板ID...</LocalizedString>
      </LocalizedStrings>
    </LocalizedResources>
    
  • 测试时切换用户语言,看生成的emailRequestBody里template_id是不是对应语言的模板ID。

内容的提问来源于stack exchange,提问作者mctl87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:45:36