2016-04-07 3 views
2
var outlookServicesClient = await AuthenticationHelper.EnsureOutlookServicesClientCreatedAsync("Calendar"); 


internal static async Task<OutlookServicesClient> EnsureOutlookServicesClientCreatedAsync(string capabilityName) 
{ 
    var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
    var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

    AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.Authority, new ADALTokenCache(signInUserId)); 

    try 
    { 
     DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri, 
      async() => 
      { 
       var authResult = await authContext.AcquireTokenSilentAsync(SettingsHelper.DiscoveryServiceResourceId,                new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret), 
         new UserIdentifier(userObjectId, UserIdentifierType.UniqueId)); 

       return authResult.AccessToken; 
      }); 

      var dcr = await discClient.DiscoverCapabilityAsync(capabilityName); 

      return new OutlookServicesClient(dcr.ServiceEndpointUri, 
       async() => 
       { 
        var authResult = await authContext.AcquireTokenSilentAsync(dcr.ServiceResourceId, 
         new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret), 
         new UserIdentifier(userObjectId, UserIdentifierType.UniqueId)); 
        return authResult.AccessToken; 
       }); 
    } 
    catch (AdalException exception) 
    { 
     //Handle token acquisition failure 
     if (exception.ErrorCode == AdalError.FailedToAcquireTokenSilently) 
     { 
      authContext.TokenCache.Clear(); 
      throw exception; 
     } 
     return null; 
    } 
    public ADALTokenCache(string user) 
    { 
     // associate the cache to the current user of the web app 
     User = user; 
     this.AfterAccess = AfterAccessNotification; 
     this.BeforeAccess = BeforeAccessNotification; 
     this.BeforeWrite = BeforeWriteNotification; 

     // look up the entry in the DB 
     Cache = db.UserTokenCacheList.FirstOrDefault(c => c.webUserUniqueId == User); 
     // place the entry in memory 
     this.Deserialize((Cache == null) ? null : Cache.cacheBits); 
    } 

Я использую этот код для аутентификации ADAL. Это нормально работает на моем локальном сервере IIS. Когда я размещал то же самое на AZURE VM, то получал ошибку, напримерОшибка при аутентификации ADAL

«Не удалось получить токен беззвучно. Метод вызова AcquireToken». Может ли кто-нибудь помочь мне в разрешении этой ошибки?

Настройки Код помощника следующим образом. В публичном ADALTokenCache (пользователь строки) мы получаем userid точно, но получаем пустой кеш ... В чем причина?

AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.Authority, new ADALTokenCache(signInUserId)); 

     try 
     { 
      DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri, 
       async() => 
       { 
        var authResult = await authContext.AcquireTokenSilentAsync(SettingsHelper.DiscoveryServiceResourceId, 
                       new ClientCredential(SettingsHelper.ClientId, 
                            SettingsHelper.ClientSecret), 
                       new UserIdentifier(userObjectId, 
                            UserIdentifierType.UniqueId)); 

        return authResult.AccessToken; 
       }); 
+0

Я проверил ниже url, но не имею решения. так что вы можете предложить любое решение для этого? https: //social.msdn.microsoft.com/Forums/en-US/92438173-df6e-47ec-92f4-3cadf61b067a/azure-ad-failed-to-acquire-token- молчал? forum = WindowsAzureAD – user3463733

+0

сделал это уже https://github.com/OfficeDev/O365-ASPNETMVC-Start/issues/28 – Aravind

+0

В этой ссылке нет решения. В локальном mechine он работает отлично, но когда я размещался в лазурной VM, проблема. Токен не освежает, я думаю. – user3463733

ответ

1

Убедитесь, что ваша власть не содержит «общего». Также, пожалуйста, включите диагностику, как описано в http://www.cloudidentity.com/blog/2015/08/07/adal-diagnostics/, и посмотрите на след. Очень часто это происходит из-за несоответствия в кеше - приобретать токенсилент работает только с кэшированными токенами, и если вы не заселили кеш/вы не работаете против экземпляра кэша, который вы выбрали ранее/вы передаете другой идентификатор пользователя/вы проходите как авторитет, вы получите пропущенный кэш.

0

Я предполагаю, что вы использовали проект O365-ASPNETMVC-Start на Github.

Что такое «ida: TenantId» в вашем файле web.config на Azure VM?

Я могу получить ту же ошибку «Не удалось получить токен беззвучно. Метод вызова AcquireToken» при установке «ida: TenantId» на «общий». Для этого scenerio вам нужно установить «ida: TenantId» на фактический идентификатор арендатора. Например, «e07xxxx0e-fxx2-441f-ad9a-9dxxa59xxx52» (guid).

+0

' <добавить ключ = "UnobtrusiveJavaScriptEnabled" значение = "истинный"/> <добавить ключ = "ида: ClientId" значение = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/> <добавить ключ = "IDA: ClientSecret" значение =" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "/> ' – user3463733

+0

Выше настроек в web.co nfig файл, вы можете проверить его один раз и предложить изменения, если я ошибаюсь. – user3463733

+0

Вы пытались вызвать «http # // your_site/Account/RefreshSession», чтобы обновить ssesion? (заменить ':'). –

Смежные вопросы