skip to Main Content

I’ve got a Xamarin.Forms app (iOS, Android, UWP) connected to Azure Mobile Apps’ authentication service. From what I read, it seemed pretty straightforward to implement. I’m testing in a UWP project, and Android, both get the same result.

When logging in, I get this lovely “can’t connect to the service you need right now.” I don’t see anything wrong in my code. What might be going on here?

Windows UWP:

public async Task<bool> Authenticate()
{
    string message = string.Empty;
    var success = false;

    try
    {
        // Sign in with Facebook login using a server-managed flow.
        if (user == null)
        {
            user = await TaskService.DefaultService.CurrentClient.LoginAsync(MobileServiceAuthenticationProvider.Facebook);
            if (user != null)
            {
                success = true;
                message = string.Format("You are now signed-in as {0}.", user.UserId);
            }
        }

    }
    catch (Exception ex)
    {
        message = string.Format("Authentication Failed: {0}", ex.Message);
    }

    // Display the success or failure message.
    await new MessageDialog(message, "Sign-in result").ShowAsync();

    return success;
}

Android:

public async Task<bool> Authenticate()
{
    var success = false;
    var message = string.Empty;
    try
    {
        // Sign in with Facebook login using a server-managed flow.
        user = await TaskService.DefaultService.CurrentClient.LoginAsync(this,
            MobileServiceAuthenticationProvider.Facebook);
        if (user != null)
        {
            message = string.Format("you are now signed-in as {0}.",
                user.UserId);
            success = true;
        }
    }
    catch (Exception ex)
    {
        message = ex.Message;
    }

    // Display the success or failure message.
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.SetMessage(message);
    builder.SetTitle("Sign-in result");
    builder.Create().Show();

    return success;
}

Can’t connect to service error:
Can't connect to service error in Windows UWP

The settings on Facebook for the app:
Facebook App Settings

Visited:

EDIT:
I’ve tried moving the client code to App.cs:

private static MobileServiceClient _Client;
public static MobileServiceClient Client
{
    get
    {
        if(_Client == null) _Client = new MobileServiceClient(AppConstants.AzureMobileServiceURL);
        return _Client;
    }
    set { _Client = value; }
}

And the new call in MainPage.xaml.cs:

uesr = await Slated.App.Client.LoginAsync(MobileServiceAuthenticationProvider.Facebook);

Same result!

Another note: My Azure Mobile Services URL does include https://

EDIT 2:
Code below for logging on backend, looks to be an issue when redirecting to /login/facebook, the rest of the authentication appears to proceed OK. FYI – replaced the sensitive data with ____

2016-07-29T18:38:43  PID[6684] Verbose     Received request: GET https://________.azurewebsites.net/login/facebook
2016-07-29T18:38:43  PID[6684] Information Redirecting: https://www.facebook.com/dialog/oauth?response_type=code&client_id=_____________&redirect_uri=https%3A%2F%2F________.azurewebsites.net%2F.auth%2Flogin%2Ffacebook%2Fcallback&scope=public_profile&state=_____________________________&display=popup
2016-07-29T18:38:50  PID[6684] Verbose     Received request: GET https://________.azurewebsites.net/.auth/login/facebook/callback?code=____________________
2016-07-29T18:38:50  PID[6684] Verbose     Calling into external HTTP endpoint GET https://graph.facebook.com/oauth/access_token.
2016-07-29T18:38:51  PID[6684] Verbose     Calling into external HTTP endpoint GET https://graph.facebook.com/oauth/access_token.
2016-07-29T18:38:51  PID[6684] Verbose     Calling into external HTTP endpoint GET https://graph.facebook.com/me.
2016-07-29T18:38:51  PID[6684] Information Login completed for 'Thomas Gardner'. Provider: 'facebook'.
2016-07-29T18:38:51  PID[6684] Verbose     Writing 'AppServiceAuthSession' cookie for site '________.azurewebsites.net'. Length: 512.
2016-07-29T18:38:51  PID[6684] Information Redirecting: https://________.azurewebsites.net/login/facebook
2016-07-29T18:38:51  PID[6684] Verbose     Received request: GET https://________.azurewebsites.net/login/facebook
2016-07-29T18:38:51  PID[6684] Verbose     Found 'AppServiceAuthSession' cookie for site '________.azurewebsites.net'. Length: 512.
2016-07-29T18:38:51  PID[6684] Verbose     Authenticated Thomas Gardner successfully using 'Session Cookie' authentication.
2016-07-29T18:38:52  PID[6684] Verbose     Received request: GET https://________.azurewebsites.net/login/facebook
2016-07-29T18:38:52  PID[6684] Verbose     Found 'AppServiceAuthSession' cookie for site '________.azurewebsites.net'. Length: 512.
2016-07-29T18:38:52  PID[6684] Verbose     Authenticated __________ successfully using 'Session Cookie' authentication.
2016-07-29T18:38:52  PID[6684] Information Request, Method=GET, Url=https://________.azurewebsites.net/login/facebook, Message='https://________.azurewebsites.net/login/facebook'
2016-07-29T18:38:52  PID[6684] Information Message='Will use same 'JsonMediaTypeFormatter' formatter', Operation=JsonMediaTypeFormatter.GetPerRequestFormatterInstance
2016-07-29T18:38:52  PID[6684] Information Message='Selected formatter='JsonMediaTypeFormatter', content-type='application/json; charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate
2016-07-29T18:38:52  PID[6684] Information Response, Status=404 (NotFound), Method=GET, Url=https://________.azurewebsites.net/login/facebook, Message='Content-type='application/json; charset=utf-8', content-length=unknown'

Backend Code: It is copied from MSFT’s template code. Not much has been done to the startup.
Startup.Mobile.App.cs

public partial class Startup
{
    public static void ConfigureMobileApp(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();

        //For more information on Web API tracing, see http://go.microsoft.com/fwlink/?LinkId=620686 
        config.EnableSystemDiagnosticsTracing();

        new MobileAppConfiguration()
            .UseDefaultConfiguration()
            .ApplyTo(config);

        // Use Entity Framework Code First to create database tables based on your DbContext
        Database.SetInitializer(new SlatedInitializer());

        // To prevent Entity Framework from modifying your database schema, use a null database initializer
        // Database.SetInitializer<SlatedContext>(null);

        MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();

        if (string.IsNullOrEmpty(settings.HostName))
        {
            // This middleware is intended to be used locally for debugging. By default, HostName will
            // only have a value when running in an App Service application.
            app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
            {
                SigningKey = ConfigurationManager.AppSettings["SigningKey"],
                ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
                ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
                TokenHandler = config.GetAppServiceTokenHandler()
            });
        }
        app.UseWebApi(config);
    }
}

public class SlatedInitializer : CreateDatabaseIfNotExists<SlatedContext>
{
    protected override void Seed(SlatedContext context)
    {
        /*List<Tasks> todoItems = new List<Tasks>
        {
            new Tasks { Id = Guid.NewGuid().ToString(), Text = "First item", Complete = false },
            new Tasks { Id = Guid.NewGuid().ToString(), Text = "Second item", Complete = false },
        };

        foreach (Tasks todoItem in todoItems)
        {
            context.Set<Tasks>().Add(todoItem);
        }*/

        base.Seed(context);
    }
}

3

Answers


  1. user = await App.MobileService .LoginAsync(MobileServiceAuthenticationProvider.Facebook);
    

    try this line of code.This should work and for the user id
    you can simply do it like that :

    var userId = user.Id;
    
    Login or Signup to reply.
  2. From the URIs that are being used, it looks like you are mixing packages between Mobile Services and Mobile Apps. The two are not compatible.

    To learn more, see Client and server versioning in Mobile Apps and Mobile Services.

    On the server, you should be using Microsoft.Azure.Mobile.Server.*. Make sure you have no packages in the form WindowsAzure.MobileServices.Backend.

    On the client, you must use the package Microsoft.Azure.Mobile.Client.

    Login or Signup to reply.
  3. Well here how I do it : in the app.xaml.cs

     public static MobileServiceClient MobileService = new MobileServiceClient("https://yourmobileservices.azurewebsites.net");
    

    then in your code behind:

    user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook);
    

    and it works like a charm for me,And make sure that in azure portal in the
    Authentication tab that under advanced settings that Token store is on.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search