1
votes

I have create a Mobile App service with Azure. I have created a new custom controller as seen below.

 [MobileAppController]
        public class NewsController : ApiController
            {
                    public ApiServices Services { get; set; }

                    // GET api/News
                    public async Task<IEnumerable<NewsItem>> Get()
                    {//returns some data}
            }

Within Azure I have enabled authentication and set the options to Active Directory as seen below.

enter image description here

I'm trying to consume the API within a Xamarin iOS application.

I create a access token via Active Directory as seen below and this works and generates the token correctly.

 public static class ServicePrincipal
    {
        static string authority = "https://login.microsoftonline.com/xxx";
        static string clientId = "xxx";
        static string clientSecret = "xx";
        static string resource = "xx";

        public static async Task<AuthenticationResult> GetS2SAccessTokenForProdMSA()
        {
            return await GetS2SAccessToken();
        }

        static async Task<AuthenticationResult> GetS2SAccessToken()
        {
            try
            {
                AdalInitializer.Initialize();

                var clientCredential = new ClientCredential(clientId, clientSecret);
                var context = new AuthenticationContext(authority, false);
                var authenticationResult = await context.AcquireTokenAsync(
                    resource,
                    clientCredential);
                return authenticationResult;
            }
            catch (Exception ex)
            {

                throw;
            }

        }
    }

However when trying to consume the API i always get an unauthorized exception.

I have tried authenticating by passing the token to the custom API like this. This throws an unauthorized exception

var client = new MobileServiceClient("THE URL");

            var authenticationResult = await ServicePrincipal.GetS2SAccessTokenForProdMSA();

            var authHeader = new Dictionary<string, string> { { "Bearer", authenticationResult.AccessToken } };

            var orderResult = await client.InvokeApiAsync("News", HttpMethod.Get, authHeader); 

I also tried the following, which doesn't work either.

CurrentPlatform.Init();


            var client = new MobileServiceClient("THE URL");

            var authenticationResult = await ServicePrincipal.GetS2SAccessTokenForProdMSA();


            JObject payload = new JObject();
            payload["access_token"] = authenticationResult.AccessToken;


            await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

Can you see any issues here, how do i pass though the authorization token?

1

1 Answers

1
votes

I suggest enabling application logging in the Azure portal and then looking to see what the authentication error is.