これをほぼ正確に再現できました。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
私の (確かに) 限られたテストに基づいて、 を使用せずにデフォルトの動作に切り替えても安全です。