迁移到 App Services Mobile App 后的身份验证:uid 与 sid

Authentication after migrating to App Services Mobile App: uid vs sid

我已经从 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 token可以唯一标识一个用户。现在所有提供商的所有用户都一样!

我如何才能使用 App Services 移动应用程序获取提供者令牌,而我以前可以通过 Azure 移动服务获取?

另外,谁能告诉我 Azure 移动服务 2.0.0-beta 的源代码?它是开源的吗?我似乎无法在 GitHub 上找到它。

编辑:这是服务器端用户的屏幕截图:

好的,在无数次重新阅读 migration documentation 之后,我重新审视了我之前的步骤之一,发现它有一个无效的假设。在文档中,它提到了身份验证的注意事项,包括以下代码块:

ServiceUser user = (ServiceUser) this.User;

FacebookCredentials creds = (await user.GetIdentitiesAsync()).OfType< FacebookCredentials >().FirstOrDefault();

string mobileServicesUserId = creds.Provider + ":" + creds.UserId;

现在,我无法找到 "GetIdentitiesAsync",而 ServiceUser 有一个可枚举的 Identities 属性,所以我要使用它。 (毕竟,它提供的信息与 ServiceUser 的迁移前版本非常相似。)但是,此方法显然获得了比 Identities 枚举中已经存在的数据更多的数据。

我仍然找不到 GetIdentitiesAsync,但在 class 浏览器中进行了一番挖掘后,我找到了名为 GetIdentityAsync 的扩展方法的单一版本在 Microsoft.Azure.Mobile.Server.AppService.ServiceUserExtensions 中(这是那里唯一的方法)。我追踪到 Microsoft.Azure.Mobile.Server.AppService 命名空间,添加了一个 using 语句并尝试了以下代码:

var hmm2 = await serviceUser.GetIdentityAsync<GoogleCredentials>();

我将保留名为 "hmm2" 的变量,因为我有以下屏幕截图:

右边带数字的绿色框是我在迁移前得到的唯一标识符!因此,要获得 uid,需要针对所有提供者凭据调用此扩展方法。当找到非空凭据时,它可以使用 nameidentifier 声明来获取提供者的用户唯一标识符。

我希望一旦 App Services 准备好生产,我们就有了更简洁的方法来获取非 null 提供者凭据,但目前这是可行的!

编辑:这是我现在在服务器端运行的代码(客户端 MobileServiceClient.UserId 不起作用。您必须 return 来自服务器的信息:

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);
}