我有一个简单的MVC .NET 4.5应用程序并使用外部网页登录 使用ADFS的服务器。
我正确配置了应用程序的web.config,登录时一切正常 通过ADFS到应用程序并重定向回具有所有用户信息的应用程序。
最近,从外部网页登录后我收到此错误:
[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: validFrom]
Microsoft.IdentityModel.Tokens.SessionSecurityToken..ctor(IClaimsPrincipal claimsPrincipal, UniqueId contextId, String context, String endpointId, Nullable`1 validFrom, Nullable`1 validTo, SymmetricSecurityKey key) +1038
Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.CreateSessionSecurityToken(IClaimsPrincipal principal, String context, String endpointId, DateTime validFrom, DateTime validTo) +276
Microsoft.IdentityModel.Web.SessionAuthenticationModule.CreateSessionSecurityToken(IClaimsPrincipal principal, String context, DateTime validFrom, DateTime validTo, Boolean isPersistent) +144
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequest request) +559
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +256
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
为什么会出现此错误?
在web.config中,我在控制器方法中都没有validFrom
变量。
答案 0 :(得分:0)
显然会发生异常,因为ValidFrom> = ValidTo;见source code的第262行。但这仍然无法解释您的配置有什么问题。
一种可能的解释是您的安全令牌生命周期太短。前一段时间我做了一些涉及令牌过期的测试。为了避免在每次测试会话中等待30分钟,我将令牌生命周期缩短为1分钟:
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<add type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089">
<sessionTokenRequirement lifetime="00:01:00"></sessionTokenRequirement>
</add>
</securityTokenHandlers>
一切都很好。但是当我几周后回到相同的测试环境时,我得到了与OP描述的相同的错误。我的猜测是,两台机器之间的时钟偏差缓慢上升,直到它最终超过60秒。从那时起,令牌被发布的ValidTo已被ValidFrom超越。
再一次,我只是在这里猜测。但我知道,一旦我恢复了30分钟的原始令牌寿命,一切都很好。
<sessionTokenRequirement lifetime="00:30:00"></sessionTokenRequirement>
假设时钟偏差 是错误的潜在原因,我肯定会检查所涉及的所有(虚拟)机器的时区设置。想象一下两个时钟,都显示在上午10点,但配置了不同的时区......即使30分钟的生命也无法弥补这个差距!