Auth0.SDK.AuthenticationCancelException в проекте Windows Phone 8.0

Я использую Auth0Client для Windows Phone 8.0. У меня проблема с Auth0.SDK.AuthenticationCancelException - beacuse это сбой моего приложения все время я нажимаю кнопку сразу после нажатия кнопки LoginFacebookTap.

Поэтому, когда я загружаю приложение, я перехожу на страницу LoginView, и есть кнопка, которая будет вызывать:

private async void LoginFacebookTap(object sender, System.Windows.Input.GestureEventArgs e)
{
 var result = await authorizationService.LoginAuth0(AuthorizationService.AuthorizationServiceType.Facebook, "", "");
 if (result == true)
 {
 MessageBox.Show("OK!");
 }
}

и это мой метод LoginAuth0

public async Task<boolean> LoginAuth0(AuthorizationServiceType type, string email, string password)
{
 if (NetworkService.IsNetworkAvailable())
 {
 try
 {
 Auth0User user;
 switch (type)
 {
 case AuthorizationServiceType.EmailAndPassword:
 user = await auth0.LoginAsync(Constants.login_with_password_Auth0, email, password);
 break;
 case AuthorizationServiceType.Email:
 user = await auth0.LoginAsync(Constants.login_azure_Auth0);
 break;
 case AuthorizationServiceType.Facebook:
 user = await auth0.LoginAsync(Constants.login_facebook_Auth0);
 break;
 case AuthorizationServiceType.Google:
 user = await auth0.LoginAsync(Constants.login_google_Auth0);
 break;
 case AuthorizationServiceType.Linkedin:
 user = await auth0.LoginAsync(Constants.login_linkedin_Auth0);
 break;
 case AuthorizationServiceType.Twitter:
 user = await auth0.LoginAsync(Constants.login_twitter_Auth0);
 break;
 case AuthorizationServiceType.Windows:
 user = await auth0.LoginAsync(Constants.login_windows_Auth0);
 break;
 }
 }
 catch (AuthenticationCancelException)
 {
 System.Diagnostics.Debug.WriteLine("User press cancel on Authentication");
 return false;
 }
 catch (AuthenticationErrorException ex)
 {
 MessageBox.Show(Resources.AppResources.TitleError + " : " + ex.Message);
 return false;
 }
 catch (Exception exc)
 {
 MessageBox.Show(Resources.AppResources.MessageErrorUserNotExists);
 System.Diagnostics.Debug.WriteLine("Unknown exception: "+exc.Message);
 return false;
 }

 try
 {
 var targetClientId = Constants.clientId_Auth0;
 var options = new Dictionary<string, string="">
 {
 { "scope", "openid profile" }
 };
 var delegationResult = await auth0.GetDelegationToken(targetClientId, options);

 if (delegationResult != null)
 {
 String jsonString = delegationResult["id_token"].ToString();
 System.Diagnostics.Debug.WriteLine("Application received token: " + jsonString);
 return true;
 }
 else MessageBox.Show(AppResources.MessageErrorSigning);
 }
 catch(Exception exc)
 {
 MessageBox.Show(Resources.AppResources.TitleError +" : " + exc.Message);
 }
 return false;
 }
 else
 {
 MessageBox.Show(Resources.AppResources.MessageErrorNoConnection);
 return false;
 }
}
</string,></boolean>

и сразу после нажатия кнопки LoginFacebookTap и нажатия кнопки "Назад" это будет выглядеть как:

Первое исключение исключения типа "Auth0.SDK.AuthenticationCancelException" произошло в Auth0Client.Phone.Silverlight.ni.DLL. Первое исключение исключения типа "Auth0.SDK.AuthenticationCancelException" произошло в mscorlib.ni.dll. Первое случайное исключение типа 'Auth0.SDK.AuthenticationCancelException' произошел в mscorlib.ni.dll В Microsoft.Phone.ni.dll произошло первое исключение типа "Исправление System.InvalidOperationException"

а затем приложение просто сбой с "InvalidOperationException Не может вернуться, когда CanGoBack является ложным". Это ошибка или?

Обновить

Я выясняю, что это происходит только при входе в вашу учетную запись на facebook, и вы аутентифицированы. Затем, когда вы снова запустите приложение и нажмите "LoginFacebookTap", вы не будете перенаправляться на страницу входа в facebook, но вы автоматически перенаправляете обратно с подтверждением "OK". Перед тем, как вы перенаправитесь обратно в LoginView, вы увидите белый экран, и когда вы нажмете Назад, вы вернетесь с "InvalidOperationException Не может вернуться, когда CanGoBack является ложным".

Обновление 2

То, что я выяснил в Auth0.SDK:

/// <summary>
/// Handler for the browser control navigation failed event. We use this to detect errors
/// </summary>
private void BrowserControl_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
 WebBrowserNavigationException navEx = e.Exception as WebBrowserNavigationException;

 if (navEx != null)
 {
 // Pass along the provided error information.
 responseErrorDetail = string.Format("Error code: {0}", navEx.StatusCode);
 }
 else
 {
 // No error information available.
 responseErrorDetail = NoDetailsAvailableMessage;
 }
 responseStatus = PhoneAuthenticationStatus.ErrorHttp;

 authenticationFinished = true;
 e.Handled = true;

 // Navigate back now.
 this.NavigateBackWithProgress();
}

/// <summary>
/// Displays the progress bar and navigates to the previous page.
/// </summary>
private void NavigateBackWithProgress()
{
 ShowProgressBar();
 NavigationService.GoBack();
}

В NavigationService.GoBack(); у нас есть InvalidOperationException Не может вернуться, когда CanGoBack является ложным.

2 ответа

Это ошибка в SDK:

private void NavigateBackWithProgress()
 {
 ShowProgressBar();
 if(NavigationService.CanGoBack)
 NavigationService.GoBack();
 }

Перед вызовом NavigationService.GoBack() мы всегда должны проверять, есть ли еще страницы в стеке. Это также относится к:

private void NavigateBackWithProgress()
 {
 ShowProgressBar();
 if(this.Frame != null && this.Frame.CanGoBack)
 this.Frame.GoBack();
 }


Да, SDK выдает исключение при отмене аутентификации. Вы ловите его, так что хорошо

licensed under cc by-sa 3.0 with attribution.