Cookie过期时如何返回401状态而非302重定向(无Identity认证)
针对你使用ASP.NET Core 2.0.5 + WsFederation 2.0.3的Cookie认证场景,要实现API请求在Cookie过期/未认证时返回401状态码,核心是修改Cookie认证的重定向事件逻辑,区分普通页面请求和API请求。
完整的ConfigureServices配置示例
public void ConfigureServices(IServiceCollection services) { // 添加MVC服务(适配包含API和页面的项目) services.AddMvc(); // 配置认证体系:默认用Cookie认证,挑战时走WsFederation services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme; }) .AddCookie(options => { // 设置你需要的短超时时间,示例为15分钟 options.ExpireTimeSpan = TimeSpan.FromMinutes(15); // 核心逻辑:拦截重定向行为,针对API请求返回401 options.Events.OnRedirectToLogin = context => { // 判定是否为API请求:可根据路径、请求头灵活调整规则 bool isApiRequest = context.Request.Path.StartsWithSegments("/api") || context.Request.Headers["Accept"].ToString().Contains("application/json"); if (isApiRequest) { // API场景直接返回401未授权 context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; } // 普通页面请求保持默认的302重定向到登录页逻辑 context.Response.Redirect(context.RedirectUri); return Task.CompletedTask; }; }) .AddWsFederation(options => { // 配置你的WsFederation服务参数,替换为实际值 options.MetadataAddress = "你的WsFederation元数据地址"; options.Wtrealm = "你的Realm标识"; }); }
关键逻辑说明
- API请求判定:通过检查请求路径前缀(如
/api)或Accept头是否包含application/json来区分API请求,你可以根据项目的实际路由规则调整这个判断条件。 - 重定向事件拦截:在
OnRedirectToLogin事件中,对API请求直接返回401状态码,避免触发302重定向;普通页面请求则保留原有的登录跳转逻辑,兼顾页面和API的不同需求。 - Cookie超时配置:通过
ExpireTimeSpan设置你需要的短超时周期,满足业务对会话时效性的要求。
额外提示
如果你的API是纯REST风格,还可以在API控制器上添加[ApiController]特性,配合认证策略进一步优化响应逻辑,但上述配置已经能解决核心问题。
内容的提问来源于stack exchange,提问作者Ryan Buening
相关产品推荐
相关产品推荐

