我正在使用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;
}
}
答案 0 :(得分:0)
最后弄清楚了问题所在!但是首先,要有一些背景。我正在构建的Web应用程序通过应用程序中的浏览器控件与WPF应用程序集成。浏览器控件是在应用程序的初始加载时未选择的选项卡,但至少会发出请求并重定向到ADFS进行身份验证。但是,直到激活浏览器选项卡之后,浏览器才完成从ADFS到我的应用程序的重定向。
为什么所有这些都很重要?好了,ADFS令牌配置为具有1小时的生存期。因此,发生的事情是用户将打开WPF应用程序,并自动通过ADFS进行身份验证并生成令牌。但是,如果他们没有在1小时的有效期内激活选项卡,则令牌将在重定向完成之前失效。我认为,如果我在浏览器中打开一个标签页,登录到ADFS,然后在我的应用有时间投放之前立即移至另一个标签页,也会发生这种情况。最终,这对于我的应用程序来说是一个奇怪的情况,但是问题的根源是令牌被发行了,但直到它过期后才被我的应用服务器验证。