如何配置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();
关键配置说明
WS-Federation参数对齐
Wtrealm必须和旧SSOweb.config中的realm完全一致(urn:someURN),否则令牌验证会失败。MetadataAddress是Optimal IDM的元数据地址,若无法访问元数据,可手动配置Configuration属性指定issuer、signing keys等信息。- 令牌验证部分,若旧SSO使用
certificateValidationMode="None",可临时关闭证书验证,但生产环境必须使用有效证书验证以保障安全。
中间件顺序
UseAuthentication()必须在UseAuthorization()之前执行,否则身份信息无法被授权中间件识别,导致IsAuthenticated始终为false。
Cookie配置
- 若需要和旧Web Forms应用共享身份状态,需确保Cookie的名称、路径、域名(跨子域时)与旧系统完全一致;无需共享则可使用默认Cookie名称。
自定义Cookie兼容
- 若依赖旧SSO设置的自定义Cookie,可在
OnValidatePrincipal事件中解析Cookie内容,补充到ClaimsPrincipal中,确保身份信息完整。
- 若依赖旧SSO设置的自定义Cookie,可在
验证方法
- 访问MVC应用中带有
[Authorize]特性的页面,确认是否自动重定向到SSO登录页。 - 登录成功后,检查回调地址(
signin-wsfed)是否正确处理令牌并重定向回应用。 - 在控制器中通过
User.Identity.IsAuthenticated验证身份状态,通过User.Claims查看Claims集合是否包含预期信息。
内容的提问来源于stack exchange,提问作者Cody Schouten
相关产品推荐
相关产品推荐

