Метод 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 и получить зарегистрированную информацию следующим образом: