首页 > 解决方案 > ASP.NET MVC 5 OWIN ADFS 令牌验证错误

问题描述

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

错误如下:

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 Server Error in '/' Application,这是我在我们的日志中看到的唯一与该页面相关的错误出现.

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

我们的应用程序使用单一的 MVC 路由来服务我们的 Angular 应用程序,并且只在该登录页面上强制执行身份验证;我们的 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;
    }
}

标签: asp.netasp.net-mvcowinadfs

解决方案


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

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


推荐阅读