ASP.NET Core中FederatedPassiveSTS.ProcessSignInRequest等效方法查询
FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest的方案 嗨,我完全理解你在从传统ASP.NET迁移到ASP.NET Core时遇到的这个WS-Federation瓶颈——这确实是迁移里容易卡壳的点,毕竟Core的身份认证体系和旧框架差异不小,没有直接对应的静态类和方法。下面是具体的替代方案和实现思路:
核心思路:使用官方WS-Federation中间件
ASP.NET Core中没有直接替换FederatedPassiveSecurityTokenServiceOperations的类,因为它的身份认证系统是基于中间件构建的。官方提供了Microsoft.AspNetCore.Authentication.WsFederation包来处理WS-Federation协议,大部分原有的功能都被封装到了这个中间件里。
步骤1:安装必要的NuGet包
首先在项目中安装官方WS-Federation认证包:
Install-Package Microsoft.AspNetCore.Authentication.WsFederation
或者使用.NET CLI:
dotnet add package Microsoft.AspNetCore.Authentication.WsFederation
步骤2:配置WS-Federation中间件
在Program.cs(ASP.NET Core 6+)或Startup.cs中配置认证服务和中间件:
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.WsFederation; var builder = WebApplication.CreateBuilder(args); // 添加认证服务 builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme; }) .AddCookie() // 使用Cookie保存认证会话 .AddWsFederation(options => { // 配置STS的元数据地址(从原项目中迁移对应的地址) options.MetadataAddress = "https://your-sts-server/FederationMetadata/2007-06/FederationMetadata.xml"; // 配置你的应用在STS中的Realm(原项目中的Wtrealm) options.Wtrealm = "urn:your-app-realm-uri"; // 可选:配置回调路径,默认是/signin-wsfed // options.CallbackPath = "/your-custom-callback"; }); builder.Services.AddAuthorization(); var app = builder.Build(); // 启用认证和授权中间件 app.UseAuthentication(); app.UseAuthorization(); // 其他中间件配置... app.Run();
步骤3:自定义ClaimsPrincipal处理(替代原方法中的principal参数)
如果需要像原方法中那样自定义ClaimsPrincipal,可以通过WS-Federation中间件的事件来实现。比如在OnSecurityTokenValidated事件中修改或扩展用户声明:
.AddWsFederation(options => { // 基础配置... options.Events.OnSecurityTokenValidated = context => { // 在这里对ClaimsPrincipal进行自定义处理,比如添加额外声明 var additionalClaims = new List<Claim> { new Claim(ClaimTypes.Role, "ApplicationAdmin"), new Claim("CustomClaim", "CustomValue") }; var appIdentity = new ClaimsIdentity(additionalClaims); context.Principal.AddIdentity(appIdentity); return Task.CompletedTask; }; });
步骤4:手动处理SignIn请求(高级场景)
如果你的场景需要更底层的手动控制,比如直接解析和响应SignIn请求,可以使用WsFederationMessage类来处理:
// 在控制器或中间件中处理请求 public IActionResult HandleSignIn() { // 从HttpRequest中解析SignIn请求消息 var message = WsFederationMessage.FromHttpRequest(Request); if (message is SignInRequestMessage signInRequest) { // 1. 验证请求的合法性(比如验证签名、Realm等) // 2. 获取或构建ClaimsPrincipal(这里可以复用原项目中的逻辑) var principal = GetCustomClaimsPrincipal(signInRequest); // 3. 生成安全令牌(如果需要手动生成,可以使用JwtSecurityTokenHandler等工具) var securityToken = GenerateSecurityToken(principal); // 4. 构建SignIn响应消息 var signInResponse = new SignInResponseMessage( new Uri(signInRequest.Wreply), securityToken, signInRequest.Wctx); // 5. 重定向到响应地址 return Redirect(signInResponse.WriteQueryString()); } return BadRequest("Invalid WS-Federation sign-in request"); }
关键说明
ASP.NET Core的WS-Federation中间件已经封装了原FederatedPassiveSecurityTokenServiceOperations.ProcessSignInRequest的核心逻辑:解析请求、验证令牌、构建响应。大部分场景下,你不需要手动处理这些细节,通过配置中间件和事件就能满足需求。
内容的提问来源于stack exchange,提问作者E1adi

