Метод Azure для мобильных служб Azure не работает с токеном проверки подлинности Microsoft

Я успешно смог получить access_token (или authenticationToken для токенов Microsoft), используя аутентификацию на стороне клиента в моем приложении Xamarin форм. Я могу получить дополнительную информацию о пользователе (адрес электронной почты, имя и т. Д.), Используя тот же токен доступа. Теперь, когда я пытаюсь передать этот токен на серверную службу Azure Mobile, я получаю ошибку 401.

Вот мой код:

        private async System.Threading.Tasks.Task<string> MSGetUserInfo(Account account)
    {
        // Reference: http://graph.microsoft.io/en-us/docs/overview/call_api
        // Note that Microsoft don't recognize the access_token header entry, but rely instead on an Authorization header entry

        var client = new HttpClient();
        var userInfoRequest = new HttpRequestMessage()
        {
            RequestUri = new Uri("https://graph.microsoft.com/v1.0/me"),
            Method = HttpMethod.Get,
        };
        // Add acccess Bearer
        userInfoRequest.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", account.Properties["access_token"]);
        using (var response = await client.SendAsync(userInfoRequest).ConfigureAwait(false))
        {
            if (response.IsSuccessStatusCode)
            {
                Models.User user = new Models.User();
                var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                var jobject = JObject.Parse(responseString);
                var userName = (string)jobject["userPrincipalName"];
                // Check username is valid
                if (String.IsNullOrEmpty(userName))
                {
                    throw new Exception("Username was not set for authenticated user");
                }
                else
                    user.ProviderLoginId = userName;

                var userDisplayName = (string)jobject["displayName"];
                // Replace display name if invalid
                if (String.IsNullOrWhiteSpace(userDisplayName))
                {
                    userDisplayName = userName;
                }
                else
                    user.Name = userDisplayName;
                var userEmail = (string)jobject["mail"];
                // Replace email if invalid
                if (String.IsNullOrWhiteSpace(userEmail))
                {
                    userEmail = userName;
                }
                else
                    user.Email = userEmail;

                Valufy.App.currentUser = user;
            }
            else
            {
                throw new Exception("OAuth2 request failed: " + await response.Content.ReadAsStringAsync().ConfigureAwait(false));
            }
        }
        return "success";
    }

Приведенный выше фрагмент кода работает для получения моих данных пользователя. Теперь, когда я пытаюсь использовать тот же токен в следующем вызове, я получаю 404:

        public async Task<bool> Authenticate(string token)
    {
        string message = string.Empty;
        var success = false;
        JObject objToken = new JObject();
        //objToken.Add("access_token", token);  //for facebook and google
        objToken.Add("authenticationToken", token); //for microsoft

        try
        {
            // Sign in with Facebook login using a server-managed flow.
            if (user == null)
            {
                //ProviderAuth("MICROSOFT");
                user = await syncMgr.CurrentClient
                    .LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, objToken);
                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;
    }

Есть ли что-то, что я делаю не так? Любая помощь приветствуется.

1 ответ

Согласно вашему описанию, я следовал за этим примером Git о Microsoft Graph Connect Sample для UWP (REST). Я мог бы получить access_token и это может работать как ожидалось с Microsoft Graph API (например, получить пользователя). Но когда я использую это access_token как authenticationToken объект токена для MobileServiceClient.LoginAsyncЯ также мог получить 401 Несанкционированный.

Затем я проверил управляемый клиент для мобильных приложений Azure на предмет аутентификации пользователей. Для потока аутентификации, управляемого клиентом, я обнаружил, что официальный пример кода использования учетной записи Microsoft работает с Live SDK следующим образом:

// Request the authentication token from the Live authentication service.
// The wl.basic scope should always be requested.  Other scopes can be added
LiveLoginResult result = await liveIdClient.LoginAsync(new string[] { "wl.basic" });
if (result.Status == LiveConnectSessionStatus.Connected)
{
    session = result.Session;

    // Get information about the logged-in user.
    LiveConnectClient client = new LiveConnectClient(session);
    LiveOperationResult meResult = await client.GetAsync("me");

    // Use the Microsoft account auth token to sign in to App Service.
    MobileServiceUser loginResult = await App.MobileService
        .LoginWithMicrosoftAccountAsync(result.Session.AuthenticationToken);
}

Примечание. Как LiveConnectSession сообщает об AuthenticationToken:

Токен аутентификации для зарегистрированного и подключенного пользователя.

Пока проверяю аутентификацию с помощью Microsoft Graph, я смог найти только access_token вместо AuthenticationToken,

ОБНОВИТЬ:

Я проверил LiveLogin для WP8 и Аутентификацию учетной записи Microsoft для мобильных приложений через Fiddler для захвата запросов на авторизацию. Я обнаружил, что аутентификация учетной записи MS имеет такой же запрос авторизации, как Live SDK.

Я предположил, что вам нужно использовать Live SDK для аутентификации пользователя при использовании аутентификации на стороне клиента с учетной записью Microsoft. Я обнаружил, что страница загрузки Live SDK не существует, вы можете использовать Live SDK для WP8, чтобы начать работу с Live SDK.

UPDATE2:

Для аутентификации клиентского потока (учетная запись Microsoft) вы можете использовать MobileServiceClient.LoginWithMicrosoftAccountAsync("{Live-SDK-session-authentication-token}")Также вы можете использовать LoginAsync с параметром токена значения {"access_token":"{the_access_token}"} или же {"authenticationToken":"{Live-SDK-session-authentication-token}"}, Я проверил LoginAsync с access_token из MSA и получить зарегистрированную информацию следующим образом:

Другие вопросы по тегам