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

如何在React应用后台结合.NET WebAPI刷新ITFoxtec SAML会话

解决SAML会话超时续期问题

针对你遇到的React前端+ITFoxtec SAML的.NET 6 Web API会话超时问题,核心是让后端在用户发起API请求时主动续期SAML会话Cookie,以下是具体实现方案:

1. 启用Cookie滑动过期配置

在.NET 6的认证配置中,开启Cookie的滑动过期机制,让用户活跃时自动重置会话有效期:

// Program.cs 中配置认证与Cookie
using Microsoft.AspNetCore.Authentication.Cookies;
using ITfoxtec.Identity.Saml2;

var builder = WebApplication.CreateBuilder(args);

// 添加SAML认证
builder.Services.AddAuthentication()
    .AddSaml2(options =>
    {
        // 你的SAML基础配置(IdP地址、Audience等)
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    });

// 配置Cookie认证选项,启用滑动过期
builder.Services.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.SlidingExpiration = true; // 关键:用户活跃时重置过期时间
    options.ExpireTimeSpan = TimeSpan.FromMinutes(15); // 初始会话有效期
    options.Cookie.SameSite = SameSiteMode.Lax; // 根据CORS场景调整,HTTPS下可设为None
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 生产环境强制HTTPS传输Cookie
    options.Cookie.HttpOnly = true; // 提升安全性,禁止前端JS访问Cookie
});

2. 确保前端请求携带Cookie

React端发送API请求时,必须配置携带凭证,否则浏览器不会传递SAML Cookie到后端:

// 示例:使用fetch发送请求
fetch('/api/your-endpoint', {
  method: 'GET',
  credentials: 'include' // 关键:携带Cookie
});

// 示例:使用axios发送请求
axios.get('/api/your-endpoint', {
  withCredentials: true // 关键:携带Cookie
});

3. 配置CORS允许凭证传递

后端必须开启CORS的凭证允许,否则浏览器会拦截Cookie:

// Program.cs 中配置CORS
builder.Services.AddCors(options =>
{
    options.AddPolicy("ReactCors", policy =>
    {
        policy.WithOrigins("https://your-react-domain.com") // 你的前端域名
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials(); // 关键:允许携带凭证
    });
});

var app = builder.Build();

// 启用CORS(需放在UseRouting之后,UseAuthorization之前)
app.UseCors("ReactCors");

4. 手动续期会话(可选)

如果滑动过期未生效,可通过中间件或基础控制器手动重置会话票据:

方式一:自定义中间件

public class SamlSessionRenewalMiddleware
{
    private readonly RequestDelegate _next;

    public SamlSessionRenewalMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            // 重置认证票据过期时间
            var authResult = await context.AuthenticateAsync();
            if (authResult.Succeeded && authResult.Ticket != null)
            {
                authResult.Ticket.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(15);
                await context.SignInAsync(authResult.Principal, authResult.Ticket.Properties);
            }
        }

        await _next(context);
    }
}

// 在Program.cs中注册中间件(放在UseAuthentication之后)
app.UseMiddleware<SamlSessionRenewalMiddleware>();

方式二:基础控制器处理

[ApiController]
public class BaseApiController : ControllerBase
{
    public override async void OnActionExecuting(ActionExecutingContext context)
    {
        if (User.Identity.IsAuthenticated)
        {
            var authResult = await context.HttpContext.AuthenticateAsync();
            if (authResult.Succeeded && authResult.Ticket != null)
            {
                authResult.Ticket.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(15);
                await context.HttpContext.SignInAsync(authResult.Principal, authResult.Ticket.Properties);
            }
        }
        base.OnActionExecuting(context);
    }
}

5. 检查ITFoxtec SAML配置

确保SAML配置中未覆盖会话过期逻辑,例如SessionNotOnOrAfter的设置需与Cookie过期时间匹配,避免IdP端的会话限制覆盖后端配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:26