- PVSM.RU - https://www.pvsm.ru -

Здравствуйте!
Одной из удобных функций Windows Azure Mobile Services является использования внешних служб аутентификаций, которые предоставляются Google, Facebook, Twitter и сам Microsoft Account. Это означает, что разработчику, нет необходимости имплементировать работу с каждым из них отдельно, для этого есть унифицированные методы.
Среди официально поддерживаемых платформ числится почти все кроме… обычной Windows Desktop.
В официальной документации по аутентификации [1] довольно подобно расписан метод использования этого функционала, однако, приведённый в нём примеру завязан на платформозависимый Windows.UI.Popups. Неужели такая мелочь может удержать нас от использования этого мощного инструмента в разработке для привычной среды, которая к тому же, все ещё доминирует? Давайте разбираться.
Отображение модального окна необходимо для:
Лично я противник модальных окон, поэтому всё сделаем в едином окне, с применением асинхронных методов.
Перед тем как начать, вы должны зарегистрировать [2] Ваше приложение у себя в Microsoft Account для получения кода клиента и секретного ключа, именно Microsoft-провайдер я буду использовать для примера.
В вёрстке нам понадобятся:
В коде реализуем метод-расширения для класса MobileServiceClient:
public static class DesktopWebLoginExtension
{
public async Task<MobileServiceUser> LoginAsync(this MobileServiceClient client, MobileServiceAuthenticationProvider provider, LoginPape loginPage)
{
Uri startUri = new Uri(client.ApplicationUri, "login/" + provider.ToString().ToLowerInvariant());
Uri endUri = new Uri(client.ApplicationUri, "login/done");
LoginResult externalAuthProviderLoginResult = await loginPage.GetLoginResultAsync(startUri, endUri);
if (externalAuthProviderLoginResult == null)
{
return null;
}
var returnServiceUser = new MobileServiceUser(externalAuthProviderLoginResult.UserId);
returnServiceUser.MobileServiceAuthenticationToken = externalAuthProviderLoginResult.AuthenticationToken;
client.CurrentUser = returnServiceUser;
return returnServiceUser;
}
}
Разберём:
А вот и сам класс-контейнер, в последствии он будет заполнен из JSON-ответа:
public class LoginResult
{
public string UserId { get; set; }
public string AuthenticationToken { get; set; }
}
Код страницы WebLoginPage выглядит вот так:
public class WebLoginPage : Page
{
private Uri startUri;
private Uri endUri;
public delegate void LoginCompleteEventHandler(LoginResult result);
public event LoginCompleteEventHandler UserLogedIn;
public LoginBrowserPage()
{
InitializeComponent();
webBrowser.Navigating += webBrowser_Navigating;
}
public Task<LoginResult> GetLoginResultAsync(Uri startUri, Uri endUri)
{
this.startUri = startUri;
this.endUri = endUri;
var returnTask = new TaskCompletionSource<LoginResult>();
webBrowser.Navigate(startUri);
this.UserLogedIn += (r) => { returnTask.SetResult(r); };
return returnTask.Task;
}
internal void webBrowser_Navigating(object sender, NavigatingCancelEventArgs e)
{
if (e.Uri.Equals(this.endUri))
{
string uri = e.Uri.ToString();
if (uri.LastIndexOf("#token=") != 0)
{
var startOfToken = uri.IndexOf("#token=") + "#token=".Length;
uri = uri.Substring(startOfToken).Replace("%2C", ",");
JObject jsonObj = JObject.Parse(uri);
var userId = jsonObj["user"]["userId"].ToObject<string>();
var authToken = jsonObj["authenticationToken"].ToObject<string>();
UserLogedIn(new LoginResult() { UserId = userId, AuthenticationToken = authToken });
}
else
{
UserLogedIn(null);
}
}
}
}
Разберём:
Теперь ничего не мешает нам в нужном месте написать:
var user = await MobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, webLoginPage);
P.S. При завершении наш webBrowser предложит нам скачать JSON ответ от сервиса. Это проблема IE движка решается вот таким ключиком в реестре:
Windows Registry Editor Version 5.00;
[HKEY_CLASSES_ROOTMIMEDatabaseContent Typeapplication/json]
«CLSID»="{25336920-03F9-11cf-8FD0-00AA00686F13}"
«Encoding»=hex:08,00,00,00
С помощью выше переведённого кода мы сняли неприятное ограничением связанное с невозможностью просто вызвать MobileService.LoginAsync в десктопном приложении и получить результат аутентификации асинхронно.
Спасибо за внимание.
Windows Azure Mobile Services REST API Reference [4]
Get started with authentication in Mobile Services [1]
Register your application in Google [5]
Автор: VladimirUA
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/48089
Ссылки в тексте:
[1] официальной документации по аутентификации: http://www.windowsazure.com/en-us/develop/mobile/tutorials/get-started-with-users-dotnet/
[2] зарегистрировать: https://account.live.com/developers/applications/index
[3] этой документации: http://msdn.microsoft.com/en-us/library/windowsazure/dn283952.aspx
[4] Windows Azure Mobile Services REST API Reference: http://msdn.microsoft.com/en-us/library/windowsazure/jj710108.aspx
[5] Register your application in Google: http://go.microsoft.com/fwlink/p/?linkid=268303&clcid=0x409
[6] Источник: http://habrahabr.ru/post/201668/
Нажмите здесь для печати.