2015-12-07 2 views
1

Основываясь на примере here Я пытаюсь аутентифицировать логин MSA на клиенте и также проверять его на стороне службы. Разница с моей заключается в том, что я использую новый API, связанный с WebAccount, в Windows 10, а не теперь устаревший Live SDK.Постоянная аутентификация в приложении UWP и службе Azure Mobile

До сих пор я получил:

var provider = await WebAuthenticationCoreManager.FindAccountProviderAsync("https://login.microsoft.com", "consumers"); 

var request = new WebTokenRequest(provider, "service::wl.basic wl.emails::DELEGATION", "none"); 

var result = await WebAuthenticationCoreManager.RequestTokenAsync(request); 

if (result.ResponseStatus == WebTokenRequestStatus.Success) 
{ 
    string token = result.ResponseData[0].Token; 

    //This calls my custom wrappers around the Live REST API v5 and runs successfully with this token 
    var acc = await LiveApi.GetLiveAccount(token); 

    var jtoken = new JObject 
    { 
     {"authenticationToken", token} 
    }; 

    try 
    { 
     //Shouldn't this work? but raises a 401 
     await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, jtoken); 

     //Alternate method? Also raises a 401 
     //await App.MobileService.LoginWithMicrosoftAccountAsync(token); 
    } 
} 

Как я уже говорил в комментариях, все я получаю являются 401С.

Насколько я могу сказать, приложение настроено правильно в учетной записи DEV центра Microsoft:

  • Я использую идентификатор клиента и секрет из одного приложения в Azure портала.
  • Выпуск JWT не ограничен.
  • URL Перенаправление имеет формат https://{appname}.azurewebsites.net/.auth/login/microsoftaccount/callback

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

await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount); 

Любые идеи? Я что-то упускаю? Любая помощь будет оценена по достоинству.

ОБНОВЛЕНО: Токен Я возвращаюсь в WebTokenRequestResult длиной 877 символов и не отображается в формате JWT с разделителями точек (.), И я вполне уверен, что это проблема. Следующая ошибка получает вход в службу, когда клиент вызывает код выше:

JWT validation failed: IDX10708: 'System.IdentityModel.Tokens.JwtSecurityTokenHandler' cannot read this string: 'EwCQAq1DBAAUGCCXc8wU/zFu9QnLdZXy+...Zz9TbuxCowNxsEPPOvXwE='. 
Application: The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.. 
Application: 2015-12-07T17:47:09 PID[5740] Information Sending response: 401.71 Unauthorized 

Какой формат является лексема в настоящее время? Может ли он быть преобразован в JWT?

По-прежнему не ближе к решению, поэтому любая помощь приветствуется.

ответ

2

Кто-то может исправить меня, но похоже, что RequestTokenAsync получает вам токен доступа, который вы не можете использовать для входа в систему. Для этого вам нужен токен аутентификации , и, насколько я вижу, RequestTokenAsync этого не делает.

Есть информация here о жетонах.

+0

Это правильно. Мобильные приложения еще не оптимизированы для UWP - SDK ориентирован на 8.1 и может быть использован в проектах UWP, но никаких изменений для размещения новых функций пока нет. Мы будем работать над обновлениями для этого. – mattchenderson

0

Если люди в конечном итоге ищут решение для App Service Mobile, обновление для MobileService. Тогда есть теперь solution

Код репликация здесь:

async Task<string> GetDataAsync() 
{ 
try 
{ 
    return await App.MobileService.InvokeApiAsync<string>("values"); 
} 
catch (MobileServiceInvalidOperationException e) 
{ 
    if (e.Response.StatusCode != HttpStatusCode.Unauthorized) 
    { 
     throw; 
    } 
} 

// Calling /.auth/refresh will update the tokens in the token store 
// and will also return a new mobile authentication token. 
JObject refreshJson = (JObject)await App.MobileService.InvokeApiAsync(
    "/.auth/refresh", 
    HttpMethod.Get, 
    null); 

string newToken = refreshJson["authenticationToken"].Value<string>(); 
App.MobileService.CurrentUser.MobileServiceAuthenticationToken 
    = newToken; 
return await App.MobileService.InvokeApiAsync<string>("values"); 
} 

Надеется, что это экономит время кому-нибудь!

Смежные вопросы