2016-07-13 17 views
1

私のuwpアプリケーションでAzure Active Directoryを使用してログイン機能を実行しようとしています。これは正常に行われますが、有効期限が切れたときにトークンをリフレッシュすることができず、常に「403 Forbiddenエラーでリフレッシュに失敗しました。リフレッシュトークンが失効または期限切れになりました。私は再度ログインウィンドウを表示しなければなりません。私が認証するために、バージョン2.1.0と次のコードを使用しています:Azure App Services(モバイルアプリケーション)AAD認証トークンのリフレッシュ

private async Task<bool> AuthenticateAsync(bool forceRelogon = false) 
    { 
     //string message; 
     bool success = false; 

     // Use the PasswordVault to securely store and access credentials. 
     PasswordVault vault = new PasswordVault(); 
     PasswordCredential credential = null; 

     //Set the Auth provider 
     MobileServiceAuthenticationProvider provider = MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory; 
     MobileServiceUser user = null; 

     try 
     { 
      // Try to get an existing credential from the vault. 
      var credentials = vault.FindAllByResource(provider.ToString()); 
      credential = credentials.FirstOrDefault(); 
     } 
     catch (Exception ex) 
     { 
      // When there is no matching resource an error occurs, which we ignore. 
      Debug.WriteLine(ex); 
     } 

     if (credential != null && !forceRelogon) 
     { 
      // Create a user from the stored credentials. 
      user = new MobileServiceUser(credential.UserName); 
      credential.RetrievePassword(); 
      user.MobileServiceAuthenticationToken = credential.Password; 

      // Set the user from the stored credentials. 
      App.MobileService.CurrentUser = user; 
      //message = string.Format($"Cached credentials for user - {user.UserId}"); 

      // Consider adding a check to determine if the token is 
      // expired, as shown in this post: http://aka.ms/jww5vp. 
      if (RedemptionApp.ExtensionMethods.TokenExtension.IsTokenExpired(App.MobileService)) 
      { 
       try 
       { 
        await App.MobileService.RefreshUserAsync(); 
       } 
       catch (Exception ex) 
       { 
        Debug.WriteLine(ex); 
       } 
      } 

      success = true; 
     } 
     else 
     { 
      try 
      { 
       // Login with the identity provider. 
       user = await App.MobileService 
        .LoginAsync(provider); 

       // Create and store the user credentials. 
       if (credential != null) 
       vault.Remove(credential); 

       credential = new PasswordCredential(provider.ToString(), 
        user.UserId, user.MobileServiceAuthenticationToken); 
       vault.Add(credential); 

       success = true; 
       //message = string.Format($"You are now logged in - {user.UserId}"); 
      } 
      catch (MobileServiceInvalidOperationException) 
      { 
       //message = "You must log in. Login Required"; 
      } 
     } 

     //var dialog = new MessageDialog(message); 
     //dialog.Commands.Add(new UICommand("OK")); 
     //await dialog.ShowAsync(); 

     return success; 
    } 

誰もが私がやっている何と間違って何かを見る、またはAADサービスプロバイダの中何もする必要はできますか?

答えて

1

サーバー側のアプリケーションログを調べると、より正確な情報を得ることができます。トークンリフレッシュの失敗の詳細が自動的にログに記録されます。アプリケーションログの詳細については、https://azure.microsoft.com/en-us/documentation/articles/web-sites-enable-diagnostic-log/を参照してください。トレースレベルをInformationalまたはVerboseに設定することをお勧めします。

また、これをまだ実行していない場合は、リフレッシュトークンを有効にするためにAzure ADに少しの追加設定が必要です。具体的には、「クライアントシークレット」を設定し、OpenID Connectハイブリッドフローを有効にする必要があります。詳細は、このブログの記事https://cgillum.tech/2016/03/07/app-service-token-store/トークンのセクションをスクロールし、AADのプロセスについての説明を参照してください)を参照してください。

0

モバイルアプリの設定について言われていること以外に、私はこれを見つけることができます。

あなたは持っている:

// Login with the identity provider. 
user = await App.MobileService.LoginAsync(provider); 

それは次のようになります。

user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,  
      new Dictionary<string, string>() {{ "response_type", "code id_token" }}); 

は多分これが役立ちます。 https://azure.microsoft.com/en-us/blog/mobile-apps-easy-authentication-refresh-token-support/

関連する問題