ASP.NET MVC 5 OWIN ADFS令牌验证错误

ASP.NET MVC 5 OWIN ADFS令牌验证错误,asp.net,asp.net-mvc,owin,adfs,Asp.net,Asp.net Mvc,Owin,Adfs,我正在开发一个ASP.NET MVC应用程序,该应用程序使用ADFS身份验证,在生产过程中,我们的日志文件中出现以下错误,我正在试图找出这个问题的原因,因为我相信它会阻止一些用户访问我们的应用程序 错误如下: System.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired. ValidTo: '08/13/2018 12:59

我正在开发一个ASP.NET MVC应用程序,该应用程序使用ADFS身份验证,在生产过程中,我们的日志文件中出现以下错误,我正在试图找出这个问题的原因,因为我相信它会阻止一些用户访问我们的应用程序

错误如下:

System.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired.
ValidTo: '08/13/2018 12:59:35'
Current time: '08/13/2018 13:15:34'.
虽然我不能确定,因为我没有错误发生的时间戳,我相信这是导致“/”应用程序中典型的ASP.NET
服务器错误的原因,这是我在日志中看到的唯一与出现的页面相关的错误

在搜索堆栈溢出时,我看到了对JWT授权的引用,而我们的应用程序并没有使用JWT授权。或者至少我们没有使用任何显式使用JWT进行身份验证的东西,这可能是在幕后发生的事情。我还看到一些帖子指出,如果身份验证服务器和应用程序服务器时间不同步,则可能会发生此错误;我正在与我的IT团队合作,以验证这些服务器的时钟是否同步,并将相应地更新

我们的应用程序使用单一的MVC路由来服务于我们的应用程序,并且只在登录页上强制进行身份验证;我们的API控制器没有特定的授权要求(我知道,糟糕的安全实践,这是我试图与团队的架构师进行的另一次谈话)

在我等待时钟上的信息时,是否有其他可能的选择我可以调查

OWIN启动代码

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        // Workaround for this bug: http://katanaproject.codeplex.com/workitem/197
        app.UseKentorOwinCookieSaver();

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            CookieSecure = CookieSecureOption.Always,
            CookieName = "Adfs Cookie Name",
        });

        app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
        {
            MetadataAddress = WebConfigurationManager.AppSettings["WSFederation:MetadataAddress"],
            Wtrealm = WebConfigurationManager.AppSettings["WSFederation:Realm"],
            SignOutWreply = WebConfigurationManager.AppSettings["WSFederation:Realm"],
            Notifications = new WsFederationAuthenticationNotifications
            {
                RedirectToIdentityProvider = ctx =>
                {
                    if (IsAjaxRequest(ctx.Request))
                    {
                        ctx.HandleResponse();
                    }

                    return Task.FromResult(0);
                }
            }
        });

        return app;
    }

    private static bool IsAjaxRequest(IOwinRequest request)
    {
        var query = request.Query;
        if (query != null && query["X-Requested-With"] == "XMLHttpRequest")
        {
            return true;
        }

        var headers = request.Headers;
        if (headers != null && headers["X-Requested-With"] == "XMLHttpRequest")
        {
            return true;
        }

        return false;
    }
}

终于找到了问题所在!但首先,一些背景。我正在构建的web应用程序通过应用程序中的浏览器控件与WPF应用程序集成。浏览器控件是在应用程序初始加载时未选择的选项卡,但至少发出请求并重定向到ADFS进行身份验证。但是,在浏览器选项卡被激活之前,浏览器没有完成从ADFS到我的应用程序的重定向


为什么这一切都很重要?ADFS令牌配置了1小时的生命周期。因此,用户将打开WPF应用程序,并自动使用ADFS进行身份验证,然后生成一个令牌。但是,如果他们在该1小时生存期内未激活该选项卡,则令牌将在重定向完成之前过期。我想,如果我在浏览器中打开一个标签,登录到ADFS,然后在我的应用程序有时间提供之前立即移动到另一个标签,也可能发生这种情况。最终,对于我的应用程序来说,这是一个奇怪的边缘案例,但问题的根源是一个令牌被发布,但直到它过期后才被我的应用服务器验证。

正确-没有JWT。WS-Fed使用SAML令牌。