首页/新闻资讯/正文详情

在 Orchard Core CMS 中集成 Microsoft Entra ID(Azure AD)外部身份提供程序

发布时间:2026/9/27 21:10:12 来源:云帆数科 栏目:资讯中心
在 Orchard Core CMS 中集成 Microsoft Entra ID(Azure AD)外部身份提供程序
CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载本指南以 Orchard Core 官方操作手册为骨架完整演示如何在 Orchard Core CMS 中启用并配置OrchardCore.MicrosoftAuthentication.AzureADMicrosoft Entra ID / Azure AD 外部身份验证与OrchardCore.Users.Registration用户注册两大功能最终构建一个允许用户使用 Azure AD 账号登录、并按 Azure 安全组Security Groups自动分配站点角色的博客站点。读完本文你将掌握 Azure Portal 应用注册的完整配置要点、Orchard Core 后台的设置路径、基于外部声明Claims的用户名生成脚本与角色同步脚本的编写方法并能独立复现整个集成链路。前置准备与整体思路在动手之前需要准备以下两项一个可运行的 Orchard Core CMS 站点参考官方指南 创建新的 Orchard Core CMS 网站 完成站点初始化。本文示例统一使用本地调试地址https://localhost:5001如果你使用了不同的端口或域名请同步替换下文所有 URL。一个已配置 Microsoft Entra ID 的 Azure 账户你需要在 Azure Portal 中注册应用、配置身份验证与令牌Token声明并把应用信息填入 Orchard Core。整条集成链路的核心脉络如下在Orchard Core Admin中启用 Entra ID 身份验证与用户注册功能在Azure Portal中创建应用注册、配置重定向 URI 与 ID 令牌、添加groups与email声明在Orchard Core 设置中填入 Application (client) ID 与 Directory (tenant) ID配置注册脚本根据 UPN 声明生成用户名与登录脚本根据groups角色声明映射到 Orchard Core 角色登出后通过外部提供程序按钮完成登录验证。启用所需的功能Features登录 Orchard Core 后台导航到https://localhost:5001/Admin/Features在功能列表中启用以下两个功能Microsoft Entra IDAzure Active Directory身份验证——即OrchardCore.MicrosoftAuthentication.AzureAD功能属于OrchardCore.Microsoft.Authentication模块该模块同时支持 Microsoft Account 与 Microsoft Entra ID 两种登录方式本文只使用后者。启用后的后台菜单位于Settings → Security → Authentication → Microsoft Entra ID详见 Microsoft Authentication 模块参考文档。用户注册Users Registration——即OrchardCore.Users.Registration功能用于允许外部用户注册本地账号外部用户创建与资料生成的细节由 Users 模块的ExternalRegistrationSettings控制。提示功能启用后Orchard Core 会刷新当前租户。你可以在功能页面看到各模块的Manifest.cs中声明的依赖关系——AzureADStartup源码通过[Feature(...)]特性注册了设置驱动、配方执行步骤、导航项以及 OpenID Connect 配置是整个功能的后端入口。在 Azure Portal 中配置目录与应用1. 创建安全组并记录 Object ID在 Azure Portal 的安全组管理页 中创建你在 Orchard Core 中想要管理/分配的角色对应的安全组例如Administrator、Moderator、Editor、Contributor、Author。复制每个组的 Object ID稍后在角色同步脚本中会用它做组到角色的映射。2. 注册应用并配置身份验证进入 应用注册页 注册新应用并完成身份验证配置填写应用名称例如Orchard Dev选择支持的账户类型详见下文单租户与多租户说明必须提供重定向 URIRedirect URI默认使用站点根路径下的/signin-oidc例如https://localhost:5001/signin-oidc。登录成功后用户会被跳回之前访问的页面此 URI 只用于处理登录回调在Implicit grant and hybrid flows下同时勾选 Access tokens 与 ID tokens否则登录会直接报错失败——这是模块文档中明确强调的硬性前提见 模块参考文档 第 5 步。3. 添加 groups 与 email 声明导航到Token configuration添加groups令牌声明这样登录令牌中才会携带安全组成员信息供 Orchard Core 侧的角色映射脚本消费在同一界面点击Add optional claimToken type 选择ID勾选email后添加。系统可能弹出授权调用 Graph API 的提示勾选Turn on the Microsoft Graph email permission并确认email声明至关重要Orchard Core 依赖它把外部登录与本地已有用户按邮箱匹配缺失该声明会导致已有用户无法登录模块文档第 6 步明确指出这一点。4. 复制 Application ID 与 Tenant ID应用创建完成后在 Azure Portal 的应用概览页复制Application (client) ID与Directory (tenant) ID它们分别对应 Orchard Core 设置中的AppId与TenantId。单租户与多租户模块对单租户/多租户应用注册均提供支持租户 ID 与可登录受众的对应关系如下完整表格见 模块参考文档受众Audience单/多租户填写的 Tenant ID谁能登录Accounts in your directory only单租户使用 Azure Portal 的 Directory (tenant) ID目录内的所有用户与来宾账号适合内部场景Accounts in any Microsoft Entra directory多租户organizations任何 Microsoft 工作或学校账号含 Microsoft 365 用户Accounts in any Microsoft Entra directory and personal Microsoft accounts多租户common工作/学校账号 个人账号Skype、Xbox、Outlook.com 等受众最广警告启用多租户意味着任何符合条件的 Microsoft 账号都能尝试认证会显著扩大潜在用户范围请务必权衡安全影响。从源码实现看AzureADOptionsConfiguration源码直接把TenantId写入MicrosoftIdentityOptions.TenantId并将登录实例固定为https://login.microsoftonline.com/——也就是说这里填的是organizations、common还是真实租户 ID直接决定了认证端点接受哪些受众。在 Orchard Core 后台配置 Entra ID 应用在 Orchard Core Admin 中导航到Settings → Security → Authentication → Microsoft Entra ID即https://localhost:5001/Admin/Settings/OrchardCore.Microsoft.Authentication.AzureAD填写以下设置设置项说明Display Name显示在 Orchard Core 登录界面上的按钮文字建议如 My Company Microsoft accountAppIdAzure Portal 中的 Application (client) ID必填TenantIdAzure Portal 中的 Directory (tenant) ID多租户应用填common或organizations必填CallbackPath登录回调路径默认/signin-oidc。一般不建议修改若修改需同步更新 Azure Portal 应用的重定向 URI若AppId或TenantId为空AzureADOptionsConfiguration会记录一条 The AzureAD login provider is enabled but not configured 警告并跳过方案注册源码登录界面便不会出现该提供程序按钮——这是排查已启用功能但登录页无按钮问题的关键线索。用配置或配方Recipe替代手工填写除了后台表单模块还支持两种程序化配置方式见 模块参考文档配方设置步骤azureADSettings{ name: azureADSettings, appId: 86eb5541-ba2b-4255-9344-54eb73cec375, tenantId: 4cc363b6-5254-4b8c-bc1b-e951a5fc85ac, displayName: Orchard Core AD App, callbackPath: /signin-oidc }通用 Settings 配方步骤{ steps: [ { name: settings, AzureADSettings: { DisplayName: Orchard Core AD App, AppId: your-app-id, TenantId: your-tenant-id, CallbackPath: /signin-oidc, SaveTokens: false } } ] }其中AzureADSettings各属性的含义为DisplayName登录按钮显示名AppId、TenantId必填CallbackPath回调路径SaveTokens是否保存访问令牌与刷新令牌bool。应用配置文件覆盖在appsettings.json中通过ConfigureAzureADSettings()扩展方法对应的键覆盖后台设置{ OrchardCore_Microsoft_Authentication_AzureAD: { DisplayName: , AppId: , TenantId: , CallbackPath: /signin-oidc, SaveTokens: false } }配置注册设置Registration导航到Settings → Security → Registrationhttps://localhost:5001/Admin/Settings/RegistrationSettings启用注册并勾选Use a script to generate userName based on external provider claims粘贴以下脚本switch (context.loginProvider) { case AzureAd: context.externalClaims.forEach(claim { if (claim.type http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn) { context.userName claim.value; } }); if (!context.userName){ context.userName azad Date.now().toString(); } break; default: log(Warning, Provider {loginProvider} was not handled, context.loginProvider); break; }脚本逻辑当外部登录提供程序为AzureAd时遍历externalClaims若存在 UPN用户主体名称声明则直接作为本地用户名否则回退生成azad 时间戳形式的用户名保证新用户总能获得一个唯一用户名。未处理的提供程序会通过log(Warning, ...)输出警告。同时勾选相关设置禁用首次注册时的用户信息询问即无需用户额外填写用户名/邮箱/密码等资料。脚本上下文context说明该脚本运行于IExternalLoginEventHandler的GenerateUserName钩子中由ScriptExternalLoginEventHandler源码驱动。可用上下文结构如下与 ExternalRegistrationSettings 编辑视图 中内置的说明一致context.userName字符串脚本为其赋值即生成用户名不赋值则系统自动生成context.loginProvider字符串本次登录的外部提供程序名此处为AzureAdcontext.externalClaims声明数组每项含subject、issuer、originalIssuer、properties、type、value、valueType字段可用claim.type与claim.value做匹配。注意启用此脚本后模块中定义的其它IExternalLoginEventHandler将不再被触发见 源码注释。配置登录设置Login导航到Settings → Security → User Loginhttps://localhost:5001/Admin/Settings/LoginSettings勾选Use a script to set user roles, user claims and user properties based on external provider claims粘贴以下脚本并把replace AdministratorObjectId等占位符替换为你此前复制的安全组 Object IDswitch (context.loginProvider) { case AzureAd: context.propertiesToUpdate {UserProfile:{UserProfile:{DisplayName:UserDisplayNameValue}}}; context.claimsToUpdate [{ claimType: DisplayName, claimValue: UserDisplayName}]; context.externalClaims.forEach(claim { if (claim.type http://schemas.microsoft.com/ws/2008/06/identity/claims/role) { switch (claim.value) { case replace AdministratorObjectId: context.rolesToAdd.push(Administrator); break; case replace ModeratorObjectId: context.rolesToAdd.push(Moderator); break; case replace EditorObjectId: context.rolesToAdd.push(Editor); break; case replace ContributorObjectId: context.rolesToAdd.push(Contributor); break; case replace AuthorObjectId: context.rolesToAdd.push(Author); break; default: log(Warning, Role {role} was not handled, claim.value); } } }); context.userRoles.forEach(role { if (!context.rolesToAdd.includes(role)){ context.rolesToRemove.push(role); }; }); break; default: log(Warning, Provider {provider} was not handled,context.loginProvider); break; }脚本逻辑分为三段更新用户属性与声明propertiesToUpdate把外部资料写入用户属性示例为更新UserProfile.DisplayNameclaimsToUpdate添加自定义声明示例为DisplayName。若多个提供程序都需要写属性框架会做 JSON 合并保留既有值源码角色映射遍历http://schemas.microsoft.com/ws/2008/06/identity/claims/role类型的角色声明即 Azure 安全组成员身份把安全组 Object ID 命中项映射为 Orchard Core 角色Administrator、Moderator、Editor、Contributor、Author未匹配的组打印警告日志角色去同步遍历context.userRoles用户当前已有角色凡是不在rolesToAdd中的角色都加入rolesToRemove确保用户离开安全组后其站点角色被同步移除避免角色残留。登录脚本上下文context说明该脚本在UpdateUserAsync钩子中运行可用上下文比注册脚本更丰富与 external-login-settings.ts 内置的类型定义一致context.user当前用户对象含userName、userRoles、userClaims、userPropertiescontext.loginProvider外部提供程序名context.rolesToAdd/context.rolesToRemove字符串数组往其中 push 角色名即可增删角色context.claimsToUpdate/context.claimsToRemove形如{ claimType, claimValue }的声明更新数组context.propertiesToUpdate用户属性更新对象context.externalClaims与注册脚本相同的声明数组。框架在脚本执行后读取rolesToAdd、rolesToRemove、claimsToUpdate、claimsToRemove、propertiesToUpdate并应用到用户源码。验证集成结果完成以上配置后从 Orchard Core 登出导航到https://localhost:5001/admin登录界面右侧会出现外部服务登录按钮显示名称即你在 Entra ID 设置中填写的 Display Name点击按钮通过 Microsoft Entra ID 完成认证首次登录会创建本地用户之后每次登录都会按脚本同步角色与声明。登录成功后你可以进入后台Configuration → Roles或用户管理确认用户已被自动分配Administrator等角色且角色会随 Azure 安全组成员关系的变化而同步增减。进阶扩展集成完成后你还可以尝试以下登录相关设置参考 ExternalLoginSettings 编辑视图禁用本地登录关闭本地账号登录入口站点仅允许外部提供程序认证自动挑战外部提供程序勾选 Use external provider for login当站点只配置了一个外部提供程序时访问登录页会直接跳转到 Entra ID不再展示登录选择界面需同时配置好注册选项。总结至此你已经把 Microsoft Entra IDAzure AD集成为博客站点管理员入口的外部身份提供程序用户可用企业账号登录并通过 Azure 安全组自动获得对应站点角色。整个过程中Azure Portal 侧的groups/email声明配置、Orchard Core 侧的应用参数与注册/登录脚本构成了外部认证到本地用户与角色的完整映射链路其底层由 OrchardCore.Microsoft.Authentication 模块OpenID Connect Microsoft.Identity.Web与 Users 模块的脚本化外部登录事件处理器共同支撑。你可以基于同样的模式继续扩展其他声明映射、自定义用户属性同步或将同样的配置通过配方Recipe固化到部署流程中。赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐DataHub 集成 Microsoft Entra IDAzure AD身份元数据摄取指南DataHub 集成 Microsoft Entra IDAzure AD身份元数据摄取指南 Microsoft Entra ID原 Azure Acti数据目录数据治理数据血缘后端前端数据工程数据集成Flet AzureOAuthProvider 实战在 Python 应用中集成 Microsoft Entra IDAzure AD登录Flet AzureOAuthProvider 实战在 Python 应用中集成 Microsoft Entra IDAzure AD登录 导读 Azur前端跨平台桌面应用移动开发使用 Microsoft Entra ID 在 Java 应用中实现 Azure 身份认证azure-identity 完整实战指南使用 Microsoft Entra ID 在 Java 应用中实现 Azure 身份认证azure identity 完整实战指南 本指南以开源仓库 ageAI 技能AI 插件上一篇RabbitMQ 4.3.1 维护版本深度解析特性标志、配置重命名与多协议连接治理下一篇Kubernetes网络策略对比Calico vs Antrea关键功能深度测评创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

云代理商视角:解密 Hermes Agent 架构,为什么它能越用越聪明?
云代理商视角:解密 Hermes Agent 架构,为什么它能越用越聪明?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:10:12

Claude Code 成本爆炸?用 TaoToken 统一 Key 把费用降到原来的 1/17
Claude Code 成本爆炸?用 TaoToken 统一 Key 把费用降到原来的 1/17

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:10:05

The JavaScript Way 第四章精读:掌握 while 与 for 循环,写出可重复执行的 JavaScript 代码
The JavaScript Way 第四章精读:掌握 while 与 for 循环,写出可重复执行的 JavaScript 代码

教程文档 【免费下载链接】thejsway The JavaScript Way book 项目地址: https://gitcode.com/gh_mirrors/th/thejsway 点击查看 免费下载 本篇指南以开源书籍《The JavaScript Way》(仓库路径:manuscript/chapter04.md)第四章 &… · 2026/9/27 21:09:59

老设备还能越狱:palera1n 在 A8–A11 上的 checkm8 越狱完整实操
老设备还能越狱:palera1n 在 A8–A11 上的 checkm8 越狱完整实操

老设备还能越狱:palera1n 在 A8–A11 上的 checkm8 越狱完整实操 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n pa… · 2026/9/27 21:38:18

Open-Pencil 文本节点缺失字体检测:useNodeFontStatus Composable 深度解析与实战
Open-Pencil 文本节点缺失字体检测:useNodeFontStatus Composable 深度解析与实战

前端桌面应用AI 应用MCP 服务 【免费下载链接】open-pencil AI-native design editor. Open-source Figma alternative. 项目地址: https://gitcode.com/gh_mirrors/op/open-pencil 点击查看 免费下载 useNodeFontStatus 是 Open-Pencil Vue SDK 提供的一个轻量级响… · 2026/9/27 21:38:18

环境搭建:Python+AI工具链安装指南(2026完整版)
环境搭建:Python+AI工具链安装指南(2026完整版)

从零搭建一套高效的AI开发环境,覆盖Python 3.12、常用AI库、Cursor IDE配置、API密钥管理。手把手带你走完全流程,避坑指南附赠。—## 目录- 一、为什么需要专门的AI开发环境- 二、Python环境搭建- 三、AI核心库安装- 四、IDE配置:Cursor VS… · 2026/9/27 21:38:18

利用SimpleCursorAdapter自定义SearchView实践:TaoToken统一Key接入AI辅助搜索建议
利用SimpleCursorAdapter自定义SearchView实践:TaoToken统一Key接入AI辅助搜索建议

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:38:12

3 步快速搭好抖音批量下载站:从扫码 Cookie 到主页增量存档
3 步快速搭好抖音批量下载站:从扫码 Cookie 到主页增量存档

3 步快速搭好抖音批量下载站:从扫码 Cookie 到主页增量存档 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback … · 2026/9/27 21:38:12

个人网站网站服务器怎么选才不被黑客盯上
个人网站网站服务器怎么选才不被黑客盯上

个人网站网站服务器怎么选才不被黑客盯上 改个需求建站公司拖一周,等你终于拿到新页面,服务器又因为配置问题被拖了三天。这种憋屈感,很多刚搞个人网站的朋友都懂。你以为是对方效率低,其实很多时候是他们在掩盖服务器选型和基础安全配置的混乱。个人网站… · 2026/9/27 21:38:12

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码