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

如何配置MVC Core应用以消费ASP.NET的WsFederated身份

ASP.NET Core MVC 集成现有WS-Federation SSO应用解决方案

核心配置步骤

在Program.cs中配置认证服务,确保参数与现有SSO应用的web.config完全匹配:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

// 配置认证体系:Cookie作为默认认证方案,WS-Fed作为挑战方案
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
// 配置WS-Federation认证
.AddWsFederation(options =>
{
    // 从Optimal IDM服务器获取元数据(自动读取 issuer、证书等信息)
    options.MetadataAddress = "https://sso.ourdomain.com/ofis/FederationMetadata/2007-06/FederationMetadata.xml";
    // 匹配旧SSO配置中的realm和audience
    options.Wtrealm = "urn:someURN";
    options.Wreply = "https://your-mvc-app-domain.com/signin-wsfed"; // 替换为你的应用回调地址
    
    // 令牌验证参数(对齐旧SSO的配置)
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "urn:ofis4", // 对应旧配置中trustedIssuers的name
        ValidateIssuer = true,
        // 若旧SSO禁用证书验证,可临时关闭(生产环境务必启用证书验证)
        ValidateIssuerSigningKey = false,
        CertificateValidator = X509CertificateValidator.None
    };
})
// 配置Cookie认证
.AddCookie(options =>
{
    // 匹配旧SSO的Cookie设置(如需共享身份状态)
    options.Cookie.Name = "WSFedAuthSampleApp";
    options.Cookie.Path = "/";
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 对应requireSsl=true
    options.Cookie.HttpOnly = true;
    
    // 可选:验证Cookie时补充旧系统自定义Cookie的信息
    options.Events = new CookieAuthenticationEvents
    {
        OnValidatePrincipal = context =>
        {
            var customAuthCookie = context.Request.Cookies["你的自定义Cookie名称"];
            if (!string.IsNullOrEmpty(customAuthCookie))
            {
                // 解析自定义Cookie,将用户信息添加到Claims中
                var identity = context.Principal.Identity as ClaimsIdentity;
                identity?.AddClaim(new Claim(ClaimTypes.Name, "解析出的用户名"));
            }
            return Task.CompletedTask;
        }
    };
});

var app = builder.Build();

// 中间件顺序必须严格遵循:Https → 静态文件 → 路由 → 认证 → 授权
if (!app.Environment.IsDevelopment())
{
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // 必须在UseAuthorization之前
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

关键配置说明

  1. WS-Federation参数对齐

    • Wtrealm必须和旧SSOweb.config中的realm完全一致(urn:someURN),否则令牌验证会失败。
    • MetadataAddress是Optimal IDM的元数据地址,若无法访问元数据,可手动配置Configuration属性指定issuer、signing keys等信息。
    • 令牌验证部分,若旧SSO使用certificateValidationMode="None",可临时关闭证书验证,但生产环境必须使用有效证书验证以保障安全。
  2. 中间件顺序

    • UseAuthentication()必须在UseAuthorization()之前执行,否则身份信息无法被授权中间件识别,导致IsAuthenticated始终为false。
  3. Cookie配置

    • 若需要和旧Web Forms应用共享身份状态,需确保Cookie的名称、路径、域名(跨子域时)与旧系统完全一致;无需共享则可使用默认Cookie名称。
  4. 自定义Cookie兼容

    • 若依赖旧SSO设置的自定义Cookie,可在OnValidatePrincipal事件中解析Cookie内容,补充到ClaimsPrincipal中,确保身份信息完整。

验证方法

  1. 访问MVC应用中带有[Authorize]特性的页面,确认是否自动重定向到SSO登录页。
  2. 登录成功后,检查回调地址(signin-wsfed)是否正确处理令牌并重定向回应用。
  3. 在控制器中通过User.Identity.IsAuthenticated验证身份状态,通过User.Claims查看Claims集合是否包含预期信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:59:59