迁移到App Services移动应用程序后的身份验证:uid vs sid

时间:2015-04-23 23:22:52

标签: azure oauth-2.0 azure-mobile-services azure-web-sites

我已经从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上找到它。

编辑:以下是服务器端用户的屏幕截图: enter image description here

1 个答案:

答案 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;的变量。因为我有以下屏幕截图:

debug inspection of serviceUser.GetIdentityAsync

右边带有数字的绿框是我在迁移之前获得的唯一标识符!因此,要获取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);
}