【问题标题】:ASP.NET MVC 5 OWIN ADFS Token validation errorASP.NET MVC 5 OWIN ADFS 令牌验证错误
【发布时间】:2018-08-13 16:06:51
【问题描述】:

我正在开发一个使用 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;
    }
}

【问题讨论】:

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

标签: asp.net asp.net-mvc owin adfs


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2014-01-02
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2015-06-09
    • 2020-09-04
    • 2016-01-19
    • 2017-01-12
    相关资源
    最近更新 更多