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

Как лучше всего использовать в лазурных мобильных службах разных поставщиков аутентификации (Facebook, Google, Windows и т. д.) и понимать, что эти три входа принадлежат одному и тому же пользователю.

По умолчанию, если пользователь1 решит использовать Facebook для аутентификации на своем мобильном телефоне и добавит некоторую информацию в приложение, а позже он (пользователь1) попытается войти с помощью Google на своем планшете, он не увидит свою информацию. Потому что это два разных пользователя с разными токенами. И я хочу получить дополнительную информацию от поставщиков аутентификации (электронная почта) и иметь свою собственную таблицу пользователей, которая содержит электронную почту и другую информацию о профиле, совместно используемую пользователем, независимо от того, какой провайдер он использует. Как я мог этого добиться?

P.S. Я использую .NET в качестве серверной части и Windows Phone в качестве клиента.


person Dmitry Gorshkov    schedule 24.02.2015    source источник


Ответы (1)


Здесь нет готового решения. Вероятно, лучше всего будет использовать таблицу поиска, которая сопоставляет статический идентификатор пользователя, который вы определяете, с различными идентификаторами поставщика удостоверений. Затем везде, где вы берете зависимость от идентификатора пользователя, вы будете выполнять поиск, чтобы сопоставить текущий идентификатор пользователя с вашим статическим идентификатором. Ваш идентификатор пользователя — это то, что хранится везде в базе данных.

Важной деталью здесь является то, что токен Mobile Services сопоставляется с идентификатором одного поставщика. Если вы посмотрите на идентификатор пользователя, на самом деле это provider:providerID. Поэтому нам нужно получить два токена и проверить их вместе, чтобы связать два идентификатора.

На клиенте вам придется вручную предлагать пользователю связать учетные записи. Вы должны сохранить текущий токен в памяти во время этого процесса, войти в систему с новым провайдером, а затем вызвать и API на бэкэнде, который выполняет ассоциацию.

string existingToken = App.MobileService.CurrentUser.MobileServiceAuthenticationToken;
App.MobileService.Logout(); // allows login with new provider
await App.MobileService.LoginAsync("google");
await App.MobileService.InvokeApiAsync("associateToken", existingToken);

На сервере вам нужно иметь возможность проверить existingToken (новый неявно проверяется путем ограничения API до AuthorizationLevel.User)

В этом API вы можете проверить токен, используя:

IServiceTokenHandler handler = this.Request.GetConfiguration().DependencyResolver.GetServiceTokenHandler()
ClaimsPrincipal claimsPrincipal;
bool didValidate = handler.TryValidateLoginToken(existingToken, ConfigurationManager.AppSettings["MS_MasterKey"], claimsPrincipal);

Вероятно, вам также следует искать идентификатор пользователя в вашей таблице поиска, чтобы избежать конфликтов.

В общем, это грубый набросок возможного решения. К сожалению больше ничего под ключ нет.

person mattchenderson    schedule 26.02.2015