这里没有开箱即用的解决方案。最好使用查找表来为您提供最佳服务,该查找表将您定义的静态用户 ID 映射到不同的身份提供者 ID。然后,在您依赖用户 ID 的任何地方,您都会进行查找以将当前用户身份与您的静态标识符相匹配。您的用户 ID 会存储在数据库中的其他任何位置。
这里的重要细节是移动服务令牌映射到单个提供商身份。如果查看用户 ID,它实际上是 provider:providerID。所以我们需要获取两个token并一起验证,才能关联两个ID。
在客户端上,您必须手动提示用户关联帐户。在此过程中,您会将当前令牌存储在内存中,使用新的提供者登录,然后在执行关联的后端调用 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);
您可能还应该在查找表中查找用户 ID 以避免冲突。
总的来说,这是一个可能的解决方案的粗略草图。不幸的是,没有更多的统包服务。