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

Umbraco 14 内网应用无缝Entra SSO实现方案咨询

在Umbraco 14中实现Entra无缝SSO(绕过Members功能)

核心思路

直接基于ASP.NET Core原生认证体系集成Entra OpenID Connect,完全绕过Umbraco的Members系统,同时通过路径区分逻辑保留后台编辑者的用户名密码登录流程,不破坏Umbraco核心功能。

步骤1:配置Entra OIDC认证

在Program.cs中添加Entra认证配置,同时隔离前台与后台的认证逻辑:

var builder = WebApplication.CreateBuilder(args);

// 初始化Umbraco服务
builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddDeliveryApi()
    .AddComposers()
    .Build();

// 配置Entra OIDC作为前台默认认证
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = OpenIdConnectDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    builder.Configuration.Bind("EntraOIDC", options);
    options.SaveTokens = true;
    options.ResponseType = "code";
    options.CallbackPath = "/signin-oidc"; // 需在Entra门户配置对应回调地址
    
    // 拦截后台路径,避免强制跳转到Entra
    options.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProvider = context =>
        {
            if (context.Request.Path.StartsWithSegments("/umbraco"))
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                context.HandleResponse();
            }
            return Task.CompletedTask;
        }
    };
});

// 配置授权策略
builder.Services.AddAuthorization(options =>
{
    // 前台默认要求Entra认证
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    
    // 保留Umbraco后台专属授权策略
    options.AddPolicy("UmbracoBackOffice", policy =>
    {
        policy.RequireRole("Administrators", "Editors");
        policy.AddAuthenticationSchemes(Umbraco.Cms.Core.Security.BackOfficeAuthenticationBuilder.BackOfficeAuthenticationScheme);
    });
});

var app = builder.Build();

// 认证/授权中间件必须在Umbraco中间件之前注册
app.UseAuthentication();
app.UseAuthorization();

// 启动Umbraco
await app.BootUmbracoAsync();
app.Run();

在appsettings.json中补充Entra配置参数:

"EntraOIDC": {
  "ClientId": "你的Entra应用客户端ID",
  "ClientSecret": "你的Entra应用客户端密钥",
  "Authority": "https://login.microsoftonline.com/你的租户ID/v2.0",
  "SignedOutCallbackPath": "/signout-callback-oidc",
  "Scope": "openid profile email"
}

步骤2:实现自动无缝SSO

由于已将Entra OIDC设为默认挑战方案,匿名用户访问前台页面时会自动重定向到Entra登录;若用户已在内网完成Entra登录,会直接完成SSO流程,无需手动点击登录按钮。

步骤3:保留后台编辑者的用户名密码登录

通过OIDC事件中的路径判断,当请求指向/umbraco后台时,取消Entra重定向,让Umbraco使用原生的后台认证流程,编辑者可以继续用用户名密码登录CMS,不受前台SSO逻辑影响。

步骤4:获取用户信息用于日志与个性化

在前台控制器或视图中,直接通过HttpContext.User获取Entra用户的身份信息:

// 控制器中获取用户信息示例
var userEmail = User.FindFirstValue(ClaimTypes.Email);
var userName = User.FindFirstValue(ClaimTypes.Name);

// 写入访问日志
logger.LogInformation("用户 {Email} 访问了首页", userEmail);

注意事项

  • 需在Entra门户中正确配置回调路径/signin-oidc和注销路径/signout-callback-oidc
  • 无需启用Umbraco的Members功能,避免认证逻辑冲突
  • 若需部分前台页面允许匿名访问,可在对应控制器/Action上添加[AllowAnonymous]特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:38:14