2

Azure B2C と MSAL を使用してユーザーの認証を試みましたが、ユーザー エクスペリエンスの問題に遭遇しました。

アプリをデバッグするときは、既に認証されており、トークンがまだ有効であるため、通常はサインインする必要はありません。ただし、Debug から Release に切り替えてアプリをテストすると、AquireTokenSilentAsync メソッドは UserTokenCache から有効なトークンを取得できないようです。私の仮定は、アプリが閉じられるたびに UserTokenCache がクリアされるということです。どういうわけか、これはデバッグ モードでは発生しません。これは、デプロイ間でキャッシュが保持されるためだと思います。

この方法で認証結果を取得していますが、さまざまなオーバーロードを試しましたが成功しませんでした。

AuthenticationResult ar = await App.PCApplication.AcquireTokenSilentAsync(App.Scopes, "", App.Authority, App.SignUpSignInpolicy, false);

そのため、サインインしてアプリを閉じて再入力すると、再度ログインする必要があります。

MSAL がまだプレビュー段階であることは十分承知していますが、この動作に関連する問題は (まだ) 見つかっていません。これは既知の問題ですか。回避策はありますか?

MSAL ソース コードを見ると、UserTokenCache が永続化のために Android SharePreferences を使用していることがわかります。これはデバッグ モードで完全に機能します。したがって、これはバグ/実装の欠落であるか、明らかな何かが見当たらない..

4

1 に答える 1

4

これをほぼ正確に再現できました。IDE デバッガーで実行すると完全に動作しますが、デバッガーにアタッチされていない場合、またはリリース バージョンとして実行されている場合は、トークンの保存に黙って失敗し、永続化を試みた後に発生する他のすべての処理も通常は実行に失敗します。

から派生した独自のキャッシュを実装し、TokenCacheそれが何をしようとしているのかを調べることで、Android でこの同じ問題を解決することができました。

ここで説明するように、デスクトップ アプリの例を見つけました。

https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-native-dotnet

FileCache次に、GitHub リポジトリで定義されているとおりに調べました。

https://github.com/AzureADQuickStarts/B2C-NativeClient-DotNet/blob/complete/TaskClient/FileCache.cs

私はそれらをコピーしFileCache、それを初期化に追加しましたPublicClientApplication:

ClientApplication = new PublicClientApplication(SharedConstants.AuthContext, SharedConstants.ClientId)
{
  RedirectUri = "urn:ietf:wg:oauth:2.0:oob",
  UserTokenCache = new FileCache(),
};

(デフォルトでは、ほとんどの例はUserTokenCacheプロパティを空のままにして、おそらくプラットフォームのデフォルトの共有設定を使用します)。

次に、読み取り/書き込み/アクセス中に詳細なログを記録するように微調整して、それが何をしているのかを確認しました。

private void AfterAccessNotification(TokenCacheNotificationArgs args)
{
  // if the access operation resulted in a cache update
  try
  {
    this.Log().Debug("About to update token cache (if it's changed)...");
    if (this.HasStateChanged)
    {
      this.Log().Debug("State has changed, updating cache file...");
      lock (FileLock)
      {
        // reflect changes in the persistent store
        _file.WriteAllBytes(CacheFilePath, this.Serialize());
        // once the write operation took place, restore the HasStateChanged bit to false
        this.HasStateChanged = false;
      }
      this.Log().Debug("Token cache file updated");
    }
    this.Log().Debug("Finished updating token cache file");
  }
  catch (Exception ex)
  {
    this.Log().ErrorException($"Something went wrong during token AfterAccessNotification: {ex.Message}", ex);
  }
}

DateTimeOffsetログは、Androidで、MSAL ライブラリの奥深くにある -type プロパティのシリアル化ハンドラーがないことに関連する例外をスローしていることを示していました。

例外が発生したことをログに記録するハンドラーを使用して try-catch でラップするAfterAccessNotificationと、すべてが完全に機能し始めました。

今のところ、このバージョンを使用することに固執しています。これFileCacheは、当面の問題をほとんど解決するためですが、認証トークンなどが現在安全に保存されていないことを意味します。

シミュレーターの iOS 10.x でも同様の問題が発生すると思われますが、まだ確認できていません。

これが誰かに役立つことを願っています。

編集: @Henrik がコメントで述べたように: プロジェクトのプロパティを編集し、 AndroidにリンクしないSystem.Runtime.Serialization.dllように指示すると、問題が完全に修正されます。FileCache私の (確かに) 限られたテストに基づいて、 を使用せずにデフォルトの動作に切り替えても安全です。

于 2016-12-07T04:05:41.337 に答える