Azure B2C自定义策略中按语言配置SendGrid模板ID失败求助
Azure B2C自定义策略本地化SendGrid模板ID问题修复
问题出在哪
你当前的配置有两个关键错误:
- 直接在InputParameter里写本地化字符串ID:
GenerateJson转换的InputParameter没法直接读取本地化的FormatLocalizedStringTransformationClaimType值,必须先通过声明(ClaimType)来中转。 - 没做本地化值到声明的转换:缺少专门的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
相关产品推荐
相关产品推荐

