Здесь нет готового решения. Вероятно, лучше всего будет использовать таблицу поиска, которая сопоставляет статический идентификатор пользователя, который вы определяете, с различными идентификаторами поставщика удостоверений. Затем везде, где вы берете зависимость от идентификатора пользователя, вы будете выполнять поиск, чтобы сопоставить текущий идентификатор пользователя с вашим статическим идентификатором. Ваш идентификатор пользователя — это то, что хранится везде в базе данных.
Важной деталью здесь является то, что токен 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