如何在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
相关产品推荐
相关产品推荐

