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

IdentityServer ASP.NET WebForms客户端超时后如何强制登出而非自动重认证?

解决IdentityServer WebForms客户端Cookie超时后自动重认证的问题

针对你的需求——让WebForms客户端在10分钟无活动Cookie过期后,跳过自动重认证直接登出,或者强制跳转到IdentityServer登录页,且仅作用于当前客户端,这里有两个可行方案:

方案1:Cookie过期后直接强制登出

你可以通过CookieAuthenticationProvider的OnValidateIdentity事件,在身份验证失败时主动触发登出流程,清除本地Cookie并跳转到指定页面:

修改客户端Startup中的UseCookieAuthentication配置,添加Provider逻辑:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Cookies",
    ExpireTimeSpan = TimeSpan.FromMinutes(10),
    SlidingExpiration = true,
    // 添加身份验证拦截逻辑
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = async context =>
        {
            // 判断Cookie是否已过期
            if (context.Properties.ExpiresUtc.HasValue && context.Properties.ExpiresUtc.Value < DateTimeOffset.UtcNow)
            {
                // 拒绝当前身份,清除本地Cookie
                context.RejectIdentity();
                // 触发OIDC登出,同时清除客户端Cookie和通知IdentityServer结束会话
                await context.OwinContext.Authentication.SignOutAsync("oidc", "Cookies");
                // 重定向到你的登出后页面(比如首页或登出提示页)
                context.Response.Redirect("/Logout.aspx");
            }
        }
    }
});

这个方案会在Cookie过期时直接清除用户身份,触发全局登出,不会进入自动重认证流程。

方案2:禁止静默重认证,强制跳转到IdentityServer登录页

如果你希望用户在Cookie过期后重新登录而不是直接登出,可以拦截OIDC的静默认证请求,强制修改为需要用户交互的登录请求:

修改客户端Startup中OpenIdConnectAuthenticationNotifications的RedirectToIdentityProvider逻辑:

Notifications = new OpenIdConnectAuthenticationNotifications
{
    RedirectToIdentityProvider = context =>
    {
        if (context.ProtocolMessage.RequestType == OpenIdConnectRequestType.Logout)
        {
            context.ProtocolMessage.IdTokenHint = context.OwinContext.Authentication
                .User.FindFirst(Constants.ResponseTypes.IdToken)?.Value;
            return Task.FromResult(0);
        }

        // 拦截静默认证请求(OIDC中间件默认会用prompt=none尝试自动重认证)
        if (string.Equals(context.ProtocolMessage.Prompt, "none", StringComparison.OrdinalIgnoreCase))
        {
            // 修改prompt参数为login,强制跳转到IdentityServer登录页
            context.ProtocolMessage.Prompt = "login";
        }

        return Task.FromResult(0);
    },
    // 保留原有的SecurityTokenValidated逻辑
    SecurityTokenValidated = n =>
    {
        var id = n.AuthenticationTicket.Identity;
        id.AddClaim(new Claim(Constants.ResponseTypes.IdToken, n.ProtocolMessage.IdToken));
        n.AuthenticationTicket = new AuthenticationTicket(id, n.AuthenticationTicket.Properties);
        return Task.FromResult(0);
    }
}

当客户端Cookie过期后,OIDC中间件原本会发送prompt=none的静默认证请求,现在会被修改为prompt=login,直接引导用户到IdentityServer登录页面重新认证。

关键说明

  • 仅作用于当前客户端:以上所有配置都是在你的WebForms客户端Startup中完成的,不会影响同一IdentityServer下的其他客户端,完全符合你的需求。
  • 方案1中的SignOutAsync("oidc", "Cookies")会同时清除客户端本地Cookie和通知IdentityServer结束用户会话;如果只需要清除客户端Cookie,只调用SignOutAsync("Cookies")即可。
  • 方案2的prompt=login会强制用户重新输入凭据,即使IdentityServer上还有有效会话;如果希望仅在IdentityServer会话也过期时才跳转登录,需要额外调用IdentityServer的会话检查接口,但这种方式复杂度更高,通常直接使用prompt=login就能满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:44