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

ASP.NET Core中FederatedPassiveSTS.ProcessSignInRequest等效方法查询

解决ASP.NET Core中WS-Federation替代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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:16:56