C# Active Directory访问令牌过期检测

C# Active Directory访问令牌过期检测,c#,active-directory,access-token,C#,Active Directory,Access Token,我在accessToken上使用这个单例模式。用于防止对login.windows服务进行不必要的令牌调用 正如您看到的,若我有访问令牌,我将向代码提供现有令牌。 我的问题是当我第一次检索令牌时。没有过期时间或任何信息。 此过期日期信息始终与请求日期相同: private静态字符串accessToken; 私有静态字符串AccessToken { 得到 { if(accessToken_==null) { accessToken=GetAccessToken(); } 返回accessToke

我在accessToken上使用这个单例模式。用于防止对login.windows服务进行不必要的令牌调用

正如您看到的,若我有访问令牌,我将向代码提供现有令牌。 我的问题是当我第一次检索令牌时。没有过期时间或任何信息。 此过期日期信息始终与请求日期相同:

private静态字符串accessToken;
私有静态字符串AccessToken
{
得到
{
if(accessToken_==null)
{
accessToken=GetAccessToken();
}
返回accessToken;
}
}
私有静态字符串GetAccessToken()
{
字符串AadInstance=”https://login.windows.net/{0}";
AuthenticationContext AuthenticationContext=新的AuthenticationContext(string.Format(AadInstance,aadTenantId));
ClientCredential ClientCredential=新的ClientCredential(clientId,clientSecretKey);
AuthenticationResult AuthenticationResult=authenticationContext.AcquireTokenAsync(ResourceId,clientCredential).Result;
返回authenticationResult.AccessToken;
}
然后我真的不知道我的代币什么时候到期?! 为了解决这个问题,我在异常捕获上有这个代码块。 我认为这不是正确的设计。您是否有其他设计合适的信息

private static CellSet ExecuteOlapCellSet(字符串mdxQuery)
{
尝试
{
…这里的方法代码。。。
}
捕获(例外e)
{
//11月25日:未经授权,可能令牌已过期。
如果(e.InnerException!=null&&e.InnerException.Message.Contains(“(401)”)
{
accessToken=GetAccessToken();
//在这里再次调用相同的方法
ExecuteLocalCellSet(mdxQuery);
}
Utils.LogError(ErrorVariables.Error105,e.InnerException??e);
抛出新的AnalystServiceException(ErrorVariables.Error105,e);
}
}

到期时间是8分钟,所以我怀疑它与请求时间相同。你考虑过时区偏移吗?谢谢你的贡献@J.Steen它确实与当前日期时间相同。但它不是。那是在未来。现在,7分钟。这就是现在的时间,UTC(偏移量00:00):
2019-11-25 09:57:35+00:00
Wow!时区是00,我还没考虑呢!这意味着此令牌有2小时的使用寿命!非常感谢。我不确定你用这段代码实现了什么。对于代码,您还需要检查令牌到期时间。如果未定义为
AuthenticationContext
的第二个参数或未将第二个参数定义为
TokenCache.DefaultShared
,则可以依赖
TokenCache
来缓存令牌进程内存,而不是编写自定义代码。你可以在网站上阅读详细信息。