private void ACSEnsureToken(string siteUrl, string realm, string appId, string appSecret, string acsHostUrl, string globalEndPointPrefix) { if (appOnlyAccessToken == null) { lock (tokenLock) { Log.Debug(Constants.LOGGING_SOURCE, "AuthenticationManager:EnsureToken(siteUrl:{0},realm:{1},appId:{2},appSecret:PRIVATE)", siteUrl, realm, appId); if (appOnlyAccessToken == null) { Utilities.TokenHelper.Realm = realm; Utilities.TokenHelper.ServiceNamespace = realm; Utilities.TokenHelper.ClientId = appId; Utilities.TokenHelper.ClientSecret = appSecret; if (!String.IsNullOrEmpty(acsHostUrl)) { Utilities.TokenHelper.AcsHostUrl = acsHostUrl; } if (globalEndPointPrefix != null) { Utilities.TokenHelper.GlobalEndPointPrefix = globalEndPointPrefix; } var response = Utilities.TokenHelper.GetAppOnlyAccessToken(SHAREPOINT_PRINCIPAL, new Uri(siteUrl).Authority, realm); string token = response.AccessToken; try { Log.Debug(Constants.LOGGING_SOURCE, "Lease expiration date: {0}", response.ExpiresOn); var lease = GetAccessTokenLease(response.ExpiresOn); lease = TimeSpan.FromSeconds(lease.TotalSeconds - TimeSpan.FromMinutes(5).TotalSeconds > 0 ? lease.TotalSeconds - TimeSpan.FromMinutes(5).TotalSeconds : lease.TotalSeconds); appOnlyACSAccessTokenResetEvent = new AutoResetEvent(false); ACSAppOnlyAccessTokenWaitInfo wi = new ACSAppOnlyAccessTokenWaitInfo(); wi.Handle = ThreadPool.RegisterWaitForSingleObject(appOnlyACSAccessTokenResetEvent, new WaitOrTimerCallback(ACSAppOnlyAccessTokenWaitProc), wi, (uint)lease.TotalMilliseconds, true); } catch (Exception ex) { Log.Warning(Constants.LOGGING_SOURCE, CoreResources.AuthenticationManger_ProblemDeterminingTokenLease, ex); appOnlyAccessToken = null; } appOnlyAccessToken = token; } } } }
internal void ACSAppOnlyAccessTokenWaitProc(object state, bool timedOut) { if (!timedOut) { ACSAppOnlyAccessTokenWaitInfo wi = (ACSAppOnlyAccessTokenWaitInfo)state; if (wi.Handle != null) { wi.Handle.Unregister(null); } } else { appOnlyAccessToken = null; } }