Azure AD B2C语言自定义配置中字符串添加换行无效如何解决
问题描述
在自有应用接入Azure AD B2C身份认证服务并启用国际化支持时,基于官方JSON格式语言文件自定义登录页面的过程中,需要在部分字符串内容间添加换行,但所有尝试的换行写法都无法生效。
先后尝试在字符串中添加\n、\\n、<br />、 、
等换行标识,均未实现预期效果,使用的配置代码如下:
[ { "ElementType": "UxElement", "ElementId": null, "StringId": "forgotpassword_link", "Override": true, "Value": "Forgot your password? (Vous avez oublié?)" }, { "ElementType": "UxElement", "ElementId": null, "StringId": "heading", "Override": true, "Value": "Sign in \n \\n (Ouverture de session)" } ]
解决方案
直接在语言文件字符串值内写入转义换行符、HTML标签不生效的核心原因是:Azure AD B2C渲染自定义语言字符串时,默认会对值做HTML转义处理,所有写入的标签、转义换行符都会被当成纯文本展示,不会被解析为换行格式。
可根据你当前使用的用户流类型,选择以下任意一种可行方案:
- 方案1:自定义页面布局+CSS控制(推荐,无配置侵入)
先定位需要加换行的字符串对应的页面DOM元素,比如示例中的heading对应登录页标题、forgotpassword_link对应忘记密码链接。在你上传的自定义HTML模板中,给对应元素添加CSS样式控制换行:如果是双语长文本场景,可以给文本容器设置固定宽度触发自动换行;如果需要在指定位置强制断行,可以通过CSS伪元素::after插入换行符实现效果,不需要修改语言包配置。 - 方案2:自定义策略开启HTML解析(仅适用于IEF自定义策略)
如果你使用的是自定义策略(Identity Experience Framework框架下的流)而非内置用户流,可以在策略的ContentDefinition配置中,给对应页面的DataUri参数追加allowHtmlInStrings=true查询参数。配置生效后,就可以直接在语言文件的Value字段中写入<br/>标签,渲染时会被正确解析为换行,示例配置如下:
注意:内置用户流(b2c-user-flow模式)不支持该参数配置,无法通过该方式开启HTML解析。{ "ElementType": "UxElement", "ElementId": null, "StringId": "heading", "Override": true, "Value": "Sign in<br/>(Ouverture de session)" } - 方案3:前端JS替换标记实现换行(全场景通用)
不管是内置用户流还是自定义策略,都可以在自定义HTML模板中加入内联JS,页面加载完成后获取对应文本的DOM节点,将提前在语言文件中写入的特殊标记(比如{br})替换为<br/>标签即可。
示例JS代码:
对应语言文件的Value字段只需要在需要换行的位置写入window.addEventListener('load', () => { // 替换标题处的换行标记 const heading = document.getElementById('heading'); if (heading) heading.innerHTML = heading.textContent.replaceAll('{br}', '<br/>'); // 替换忘记密码链接处的换行标记 const forgotPwdLink = document.getElementById('forgotpassword_link'); if (forgotPwdLink) forgotPwdLink.innerHTML = forgotPwdLink.textContent.replaceAll('{br}', '<br/>'); }){br}即可,比如"Value": "Sign in{br}(Ouverture de session)"。
注意:不要尝试在语言文件中直接写入Unicode换行符或转义控制序列,Azure AD B2C的语言包解析逻辑会直接过滤这类字符,不会保留到最终渲染的页面文本中。
内容的提问来源于stack exchange,提问作者MJ X
相关产品推荐
相关产品推荐

