我已经从Azure移动服务迁移到新的App Services移动应用程序,并且我在客户端使用新的AMS 2.0.0-beta。
我为OAuth 2.0实施了两个(目前)提供商:Google和Twitter。
以前,我能够通过服务器主体中的声明获取提供者令牌,并且会有一个uid(唯一ID)声明,该声明可能是" Google:123456789"或者" Twitter:123456789010" (或许多字母数字)。我相信MobileServiceClient.UserId也暴露了这一点。
现在,在我迁移到新的App Services移动应用程序之后(我现在正在使用预览门户网站,这在很大程度上非常棒),不再是uid声明,而是一个单独的sid(会话ID)声明,如:" sid:ABCDEFGHIJKLMNOPQRSTUVWXYZ",无论我登录哪个提供商。当我在客户端查看MobileServiceClient.UserId值时,它也会给出这个" sid"值。
关键是以前uid令牌可以唯一地标识用户。现在所有提供商的所有用户都是一样的!
如何通过以前能够通过Azure移动服务获得的应用服务移动应用获取提供商令牌?
另外,有人能指出Azure Mobile Services 2.0.0-beta的源代码吗?它是开源的吗?我似乎无法在GitHub上找到它。
编辑:以下是服务器端用户的屏幕截图:
答案 0 :(得分:5)
好的,在无条件重读migration documentation之后,我重新审视了我之前的一个步骤,发现它的假设无效。在文档中,它提到了身份验证的注意事项,包括以下代码块:
ServiceUser user = (ServiceUser) this.User;
FacebookCredentials creds = (await user.GetIdentitiesAsync()).OfType< FacebookCredentials >().FirstOrDefault();
string mobileServicesUserId = creds.Provider + ":" + creds.UserId;
现在,我无法找到&#34; GetIdentitiesAsync&#34;,而ServiceUser具有Identities可枚举属性,所以我就是这样做的。 (毕竟,它提供的信息与ServiceUser的迁移前版本非常相似。)但是,这种方法显然获得了比Identities枚举中已有的更多的数据。
我仍然无法找到GetIdentitiesAsync
,但在类浏览器中进行了一些挖掘后,我能够找到GetIdentityAsync
中名为Microsoft.Azure.Mobile.Server.AppService.ServiceUserExtensions
的扩展方法的单一版本。 1}}(它是唯一的方法)。我将其跟踪到Microsoft.Azure.Mobile.Server.AppService
命名空间,添加了一个using语句并尝试了以下代码:
var hmm2 = await serviceUser.GetIdentityAsync<GoogleCredentials>();
我留下名为&#34; hmm2&#34;的变量。因为我有以下屏幕截图:
右边带有数字的绿框是我在迁移之前获得的唯一标识符!因此,要获取uid,需要针对所有提供程序凭据调用此扩展方法。当找到非空凭证时,它可以使用nameidentifier
声明来获取用户的提供者的唯一标识符。
我希望一旦App Services准备就绪,我们就可以通过一些更简洁的方式获取非null提供程序凭据,但是现在这个工作正常!
编辑:这是我的代码现在正在服务器端工作(客户端MobileServiceClient.UserId不起作用。你必须从服务器返回信息):
var serviceUser = (Microsoft.Azure.Mobile.Server.Security.ServiceUser)Thread.CurrentPrincipal;
try
{
var googleCreds = await serviceUser.GetIdentityAsync<GoogleCredentials>();
if (googleCreds != null && googleCreds.Claims != null)
{
_CurrentProvider = "Google";
var nameClaim = googleCreds.Claims.Single(x => x.Key.Contains("nameidentifier"));
_CurrentProviderKey = nameClaim.Value;
return;
}
var twitterCreds = await serviceUser.GetIdentityAsync<TwitterCredentials>();
if (twitterCreds != null && twitterCreds.Claims != null)
{
_CurrentProvider = "Twitter";
var nameClaim = twitterCreds.Claims.Single(x => x.Key.Contains("nameidentifier"));
_CurrentProviderKey = nameClaim.Value;
return;
}
throw new NotSupportedException("The OAuth Provider is not supported.");
}
catch (Exception ex)
{
throw new InvalidOperationException("There was an error updating the authentication provider. InnerException: " + ex, ex);
}