Я пытаюсь заставить Azure AD B2C работать в моем приложении xamarin.чтобы проверить, если мы уже вошли в систему, я использую код, как показано ниже.
public async Task<bool> IsLoggedIn()
{
IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();
if (accounts != null)
{
return accounts.Any();
}
return false;
}
}
Мой код при запуске выглядит следующим образом
protected async override void OnStart()
{
var authenticationService = Container.Resolve<IAuthenticationService>();
bool isLoggedIn;
isLoggedIn = await authenticationService.IsLoggedIn();
if (isLoggedIn)
{
var cachingService = Container.Resolve<ICachingService>();
AppUser = await authenticationService.Login(cachingService.CurrentMode);
await NavigationService.NavigateAsync("http://www.xxxx.com/root/navigation/main");
}
else
{
await NavigationService.NavigateAsync("http://www.xxxx.com/navigation/login");
}
}
}
, если я просто возвращаю false из IsLoggedIn, он правильно отображает страницу входа.Но вызов
IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();
кажется проблематичным.
я получаю исключение (иногда), что System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта
, но, глядя на объект приложения в «QuickWatch», я вижу, что объект PAC заполнен правильно.
ОБНОВЛЕНИЕ Конструктор App.cs выглядит следующим образом
public static PublicClientApplication PCA = null;
public App(IPlatformInitializer initializer = null) : base(initializer)
{
PCA = new PublicClientApplication(GlobalSetting.Instance.ClientID, GlobalSetting.Instance.AuthoritySignUpSignIn);
PCA.RedirectUri = $"msal{GlobalSetting.Instance.ClientID}://auth";
}
мой метод входа выглядит так
public async Task<User> Login(string mode)
{
IEnumerable<IAccount> accounts = await App.PCA?.GetAccountsAsync();
AuthenticationResult ar;
try
{ //get token from cache.
ar = await App.PCA?.AcquireTokenSilentAsync(GlobalSetting.Instance.Scopes, GetAccountByPolicy(accounts, GlobalSetting.Instance.PolicySignUpSignIn), GlobalSetting.Instance.AuthoritySignUpSignIn, false);
}
catch (MsalUiRequiredException ex)
{
// get token from interaction.
ar = await App.PCA?.AcquireTokenAsync(GlobalSetting.Instance.Scopes, GetAccountByPolicy(accounts, GlobalSetting.Instance.PolicySignUpSignIn), App.UiParent);
}
//fetch token and make actual user object.
return new User
{
Id = _cachingService.LoggedInUserId,
Name = "Jessica Doe",
ProfilePicUrl = "https://content-static.upwork.com/uploads/2014/10/01xxx27/profilephoto1.jpg",
BusinessProfile = _userService.GetBusinessProfile(_cachingService.LoggedInUserId),
ProfileVariables = _userService.GetUserProfileVariables(_cachingService.LoggedInUserId),
Settings = _userService.GetSettings(_cachingService.LoggedInUserId)
};
}
он работает, когда я не вызываюAcquireTokenSilentAsync и просто отправить поддельный объект пользователя и не работает, когда я вызываю AcquireTokenSilentAsync.Объект ar заполняется, он переходит на главную страницу, попадает в конструктор модели представления, но показывает пустую страницу.
Я также пробовал разные версии MSAL.сейчас на последней версии.
UPdate2
, детализированное до этого исключения
{Microsoft.Identity.Client.MsalClientException: у приложения нет включенных групп доступа цепочки для ключей в Списке Entitlements.plist.В результате не удалось сохранить брелок для iOS.Группа доступа цепочки для ключей «3G3LMCD5R.com.microsoft.adalcache» не включена в список Entitlements.plist.См. https://aka.ms/msal-net-enable-keychain-groups для получения дополнительной информации о включении групп доступа и прав доступа цепочки для ключей.в Microsoft.Identity.Core.iOSTokenCacheAccessor.Save (учетная запись System.String, служба System.String, универсальный System.String, тип System.Int32, значение System.String) [0x00052] в: 0 в Microsoft.Identity.Core.iOSTokenCacheAccessor.SaveAccessToken (элемент Microsoft.Identity.Core.Cache.MsalAccessTokenCacheItem) [0x00028] в: 0 в Microsoft.Identity.Core.Telemetry.TelemetryTokenCacheAccessor.SaveAccessToken (Microsoft.Identity.Core.CacheTen в [0].в Microsoft.Identity.Core.Telemetry.TelemetryTokenCacheAccessor.SaveAccessToken (элемент Microsoft.Identity.Core.Cache.MsalAccessTokenCacheItem, запрос Microsoft.Identity.Core.RequestContext requestContext) [0x0002aI.enTen.enTen.en.en.enTen.Exen.en.en.en.en.en.en.en.en].Microsoft.Identity.Core.Instance.IValidatedAuthoritiesCache validatedAuthoritiesCache, Microsoft.Identity.Core.Instance.IAadInstanceDiscovery aadInstanceDiscovery, Microsoft.Identity.Client.Internal.Requests.AuthenticationRequestParameteters requestParams, Microsoft.Identity.Core.OAuth2.MsalTokenResponse response) [0x00143] в: 0 в Microsoft.Identity.Client.Internal.Requests.RequestBase.CacheTokenResponseAndCreateAuthenticationResult (Microsoft.IdentTense0_0sese_set_set_set_setup_set_set_set_set_set_set_set_set_set_set_set_set_set_set_R_R_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_P_PC: 0 в Microsoft.Identity.Client.Internal.Requests.InteractiveRequest + d__9.MoveNext () [0x00168] in: 0 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в Microsoft.Identity.Client.Internal.Requests.RequestBase + d__28.MoveNext () [0x00160] in: 0 --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в Microsoft.Identity.Client.PublicClientApplication + d__24.MoveNext () [0x000ef] in: 0 --- Конец трассировки стека из предыдущего местоположения, в которое было сгенерировано исключение --- в Microsoft.Identity.Client.PublicClientApplication + d__17.MoveNext () [0x000ac] in: 0 --- Конец трассировки стека из предыдущегоместо, где было сгенерировано исключение --- на CDThat.Services.AzureADB2CAuthenticationService + d__3.MoveNext () [0x000fc] в C: \ CDthatbest \ CDThat \ Services \ AzureADB2CAuthenticationService.cs: 45 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в CDThat.ViewModels.LoginPageViewModel + d__8.MoveNext () [0x0003c] в C: \ CDthatbest \ CDThat \ ViewModels \ LoginPageViewModel.cs: 56 --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.AsyncMethodBuilderCore + <> c.b__6_0 (состояние System.Object) [0x00000] в /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.11/src/Xamarin.iOS/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsynuMetho.cs: 1023 в Foundation.NSAsyncSynchronizationContextDispatcher.Apply () [0x00000] в /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.11/src/Xamarin.iOS/Foundation/NSAction.cs:178 в wrapper-to-native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr) в UIKit.UIApplication.Main (System.String [] args, System.IРуководитель ntPtr, делегат System.IntPtr) [0x00005] в /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.11/src/Xamarin.iOS/UIKit/UIApplication.cs:79 в UIKit.UIApplication.Main (система.String [] args, System.String PrincipalClassName, System.String DelegateClassName) [0x0002c] в /Library/Frameworks/Xamarin.iOS.framework/Versions/12.2.1.11/src/Xamarin.iOS/UIKit/UIApplication.cs:63в CDThat.iOS.Application.Main (System.String [] args) [0x00014] в C: \ CDthatbest \ CDThat.iOS \ Main.cs: 16 ErrorCode: missing_entitlements}