2017-11-03 5 views
0

ウェブ上の多くの投稿を読んだ後に紛失してしまい、助言が必要です。 Xamarin.FormsプロジェクトでADAL 3.17.1を使用しています。 ADAL3では、リフレッシュトークンとAcquireTokenByRefreshTokenAsyncは使用できなくなり、内部的に処理されます。しかし、メモリに保存されているこのRefreshトークンは、IOSアプリケーションがバックグラウンドで実行されたとき、またはアプリケーションが閉じられていて再オープンされたときに、ユーザは再びログを記録する必要があります。ADAL 3トークンの永続性

午前中にユーザーログを記録し、トークンを8-10時間有効にすることはできますか。アプリが起動したり、次の8-10時間以内に再開したときにログインするように求めていないのですか?私はそれについてのポストを見つけることができません。すべての記事は、リフレッシュトークンを使用している...ここで

はIOSで実行され、私の認証クラスのコードです:あなたは新しいキャッシュを初期化しているよう

public class Authenticator_iOS : IAuthenticator 
 
    { 
 
     public async Task<MultipleAuthResult> Authenticate(string authority, string resource, string resource2, string clientId, string returnUri) 
 
     { 
 
      MultipleAuthResult multipleAuth = new MultipleAuthResult(); 
 

 
      var authContext = new AuthenticationContext(authority, new CustomTokenCache()); 
 
      if (authContext.TokenCache.ReadItems().Any()) 
 
       authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority); 
 

 
      var controller = UIApplication.SharedApplication.KeyWindow.RootViewController; 
 
      var uri = new Uri(returnUri); 
 
      var platformParams = new PlatformParameters(controller); 
 
      platformParams.PromptBehavior = PromptBehavior.Auto; 
 
      
 

 
      try 
 
      { 
 
       multipleAuth.ResultBackEnd = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);  // Token for backend 
 
       multipleAuth.ResultGraph = await authContext.AcquireTokenAsync(resource2, clientId, uri, platformParams);  // Token for Graph query 
 
      } 
 
      catch (Exception e) 
 
      { 
 
       return null; 
 
      } 
 

 
      return multipleAuth; 
 
     } 
 

 
     public void SingOut(string authority) 
 
     { 
 
      //Token 
 
      var authContext = new AuthenticationContext(authority); 
 
      if (authContext.TokenCache.ReadItems().Any()) 
 
      { 
 
       authContext.TokenCache.Clear(); 
 
      } 
 

 

 
      //Webview cookie 
 
      NSHttpCookieStorage CookieStorage = NSHttpCookieStorage.SharedStorage; 
 
      foreach (var cookie in CookieStorage.Cookies) 
 
      { 
 
        CookieStorage.DeleteCookie(cookie); 
 
      } 
 

 
     } 
 
    }

+0

、それはXamarinクラスで利用可能である必要がありますので。トークンを取得するメソッドにはオーバーロードがあり、トークンキャッシュオブジェクト(最初に作成して独立した記憶域に保持する)に渡すことができます。トークンは1時間有効です。次に、 '.AcquireTokenAsync()'を呼び出すとキャッシュからのリフレッシュトークンを使用して新しいトークンを取得し、UIプロンプトなしでトークンを更新します。 – evilSnobu

+0

返信いただきありがとうございます。私はADAL3のようなAuthenticatorクラスを使用します。 UWPとAndroidでは "キャッシュ"機能がうまく機能しますが、IOSはログインを要求し続けます。 私が使用しているコードで投稿を更新します –

答えて

0

が見えますメソッドが起動するたびにインスタンス化されます。

このチェック議論の余地をレンダリング
var authContext = new AuthenticationContext(authority, new CustomTokenCache()); 

if (authContext.TokenCache.ReadItems().Any()) 

だけで完全にCustomTokenCacheを初期化削除し、私はそれがデフォルトで維持されます感を持っています。 は、代わりにこれを行う:iOSの分離ストレージあります

var authContext = new AuthenticationContext(commonAuthority); 

if (authContext.TokenCache.ReadItems().Count() > 0) 
{ 
    authContext = new AuthenticationContext(
     authContext.TokenCache.ReadItems().First().Authority); 
} 
+0

あなたの返信ありがとうございます。私は自分のコードを変更しますが、私のIOSアプリケーションを閉じる、再起動する、または再開するときに同じ動作が起こっています。しかし、データをAzureにプッシュする必要があるときは、もう一度サインインして、この時間にauthContext.TokenCache.ReadItems()。Count()はコンテキストを返します。 IOS11がセキュリティのためにローカルキャッシュの代わりにメモリキャッシュにAccessTokenを置いているところ(私はそれを見つけることができない)のどこかを読んだ。この方法では、ADALが自動的に処理する「リフレッシュトークン」は、アプリケーションの終了後または再開後に失われます...私は解決策をまだ見つけられません... –

+0

Xamarinサポートプランがある場合、 iOS11上でADALを結ぶXamarinのサンプルを探してみてください。おそらくキャッチがあります。 – evilSnobu

+0

マイクロソフトのサポートケースを開いた後、私はこの答えを得ました。Mac OS XのADALではキーチェーンが直接サポートされていません。デフォルトのキャッシング実装ではプロセスのライフタイムのトークンは保持されますが、トークンを永続化したい場合は、ADTokenCacheDelegateを実装し、それをAuthenticationContextの作成に提供する必要があります。C#Xamarin.IOSプロジェクトの場合、何も見つかりませんでした。何か案が? –