在 Azure 移动服务中使用不同的身份验证提供商(Facebook、Google、Windows 等)并了解这三个登录属于同一用户的最佳实践是什么。
开箱即用,如果用户1选择在手机上使用Facebook进行身份验证并向应用程序添加一些信息,然后他(用户1)尝试在平板电脑上使用Google登录,他将看不到自己的信息。因为他们是两个不同的用户,拥有不同的代币。我想从身份验证提供商(电子邮件)获取一些附加信息,并拥有自己的用户表,其中包含为用户共享的电子邮件和其他个人资料信息,无论他使用哪个提供商。我怎样才能实现它?
附注我使用 .NET 作为后端,Windows Phone 作为客户端
最佳答案
这里没有开箱即用的解决方案。使用查找表可能会为您提供最好的服务,该表将您定义的静态用户 ID 映射到不同的身份提供商 ID。然后,在任何依赖用户 ID 的地方,您都将进行查找以将当前用户身份与静态标识符相匹配。您的用户 ID 存储在数据库中的其他位置。
这里的重要细节是移动服务 token 映射到单个提供商身份。如果你看一下用户ID,它实际上是provider:providerID。所以我们需要获取两个token并一起验证,以便关联两个ID。
在客户端上,您必须手动提示用户链接帐户。在此过程中,您将把当前 token 存储在内存中,使用新的提供程序登录,然后调用后端上的 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 来隐式验证新 token )
在该 API 中,您可以使用以下方法验证 token :
IServiceTokenHandler handler = this.Request.GetConfiguration().DependencyResolver.GetServiceTokenHandler()
ClaimsPrincipal claimsPrincipal;
bool didValidate = handler.TryValidateLoginToken(existingToken, ConfigurationManager.AppSettings["MS_MasterKey"], claimsPrincipal);
您可能还应该在查找表中查找用户 ID 以避免冲突。
总的来说,这是一个可能的解决方案的粗略草图。不幸的是,没有更多的交 key 服务。
关于authentication - 如何在azure移动服务中链接不同的身份验证提供商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28702414/