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.