迁移到 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);
}
我已经从 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);
}