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

时间:2018-08-13 16:06:51

标签: 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: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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

为什么所有这些都很重要?好了,ADFS令牌配置为具有1小时的生存期。因此,发生的事情是用户将打开WPF应用程序,并自动通过ADFS进行身份验证并生成令牌。但是,如果他们没有在1小时的有效期内激活选项卡,则令牌将在重定向完成之前失效。我认为,如果我在浏览器中打开一个标签页,登录到ADFS,然后在我的应用有时间投放之前立即移至另一个标签页,也会发生这种情况。最终,这对于我的应用程序来说是一个奇怪的情况,但是问题的根源是令牌被发行了,但直到它过期后才被我的应用服务器验证。