Xamarin.forms ZUMO登录(MobileServiceUser)的SID不同于用户';目标

Xamarin.forms ZUMO登录(MobileServiceUser)的SID不同于用户';目标,xamarin.forms,azure-active-directory,mobileserviceclient,zumo,Xamarin.forms,Azure Active Directory,Mobileserviceclient,Zumo,我正在开发一个基于Xamarin.Forms的跨平台应用程序,目标是iOS和Android。我的后端是作为Azure应用程序服务托管的ASP.NET Web应用程序,用户可以注册我在Azure Active Directory B2C中管理的帐户。对于身份验证,我使用MSAL4.0,客户端应用程序使用MobileServiceClient库与后端进行通信 由于用户的数据具有关系,我选择让控制器的put方法自动添加用户的SID,并在该SID上过滤请求的数据,因为此标识符在通过用户ICLAIMS主体

我正在开发一个基于Xamarin.Forms的跨平台应用程序,目标是iOS和Android。我的后端是作为Azure应用程序服务托管的ASP.NET Web应用程序,用户可以注册我在Azure Active Directory B2C中管理的帐户。对于身份验证,我使用MSAL4.0,客户端应用程序使用MobileServiceClient库与后端进行通信

由于用户的数据具有关系,我选择让控制器的put方法自动添加用户的SID,并在该SID上过滤请求的数据,因为此标识符在通过用户ICLAIMS主体进行授权后可用

然而,我不了解这些小岛屿发展中国家的起源,因为我在其他任何地方都找不到它们

到目前为止,我能说的是:

在Azure ADB2C中,我有两个注册用户。其中一个(UserA)使用Facebook作为身份提供者,另一个(UserB)使用微软

UserA在ADB2C上具有对象Id FFC1***。 UserB在ADB2C上具有对象Id E990***

两者的名称相同,但注册的电子邮件地址不同

这是我如何实例化MSAL客户端的:

public static IPublicClientApplication PCA = null;
...
PCA = PublicClientApplicationBuilder.Create(ClientID)
        .WithRedirectUri($"msal{ClientID}://auth")
        .WithB2CAuthority(Authority)
        .WithIosKeychainSecurityGroup("com.microsoft.msalrocks")
        .Build();
ClientId指Azure Active Directory B2C>应用程序>应用程序>应用程序Id

权威决定

B2C上的策略配置(用户流)配置为包括以下声明:

  • 姓名
  • 身份提供者
  • 用户的对象Id
我通过以下方式使用MSAL登录:

var accounts = await App.PCA.GetAccountsAsync();
var result = await App.PCA.AcquireTokenSilent(
                       App.Scopes, 
                       accounts.FirstOrDefault())
                 .WithB2CAuthority(App.Authority)
                 .ExecuteAsync();
应用范围解析为

public static string[] Scopes = {
        "https://application.onmicrosoft.com/api/user_impersonation",
        "https://application.onmicrosoft.com/api/offline_access"};
此时,我有一个AuthenticationResult,我可以从中提取有价值的信息,例如用户的给定名称或与我在Azure B2C目录的用户管理窗格中也可以看到的对象Id相等的对象Id:

AuthenticationResult包含一个IdToken和一个AccessToken。它们与添加包含作用域的scp属性的AccessToken几乎相同。在我的例子中,它包含“用户模拟”

现在,随着用户通过ADB2C认证,我需要我的应用程序也将认证转发给ZUMO,即MobileServiceClient,以便用户可以对我的后端控制器进行授权呼叫

为此,我需要重新返回的AccessToken(我也可以从上面的AuthenticationResult中提取),将其包装到JObject中,最后将其传输到MobileServiceClient,如下所示:

MobileServiceClient client;

client = new MobileServiceClient("https://application.azurewebsites.net");

var zumoPayload = new JObject()
{
    ["access_token"] = result.AccessToken
};

await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, zumoPayload);
既然MobileServiceClient有一个经过身份验证的用户,那么未来的每个httprequest都将包含控制器的[authorize]属性满足的相应信息

不过

这就是它变得奇怪的时候

当实例化MobileServiceClient并使用上面的ZumoPayload调用其LoginAsync方法时,生成的MobileServiceUser将填充两个属性:

  • MobileServiceAuthenticationToken和
  • 用户ID
有趣的是,这个令牌看起来与我使用MSAL进行身份验证时收到的IdToken或AccessToken非常不同,但更让我感到不安的是,用户Id甚至完全不同

包含一个子属性,其中包含UserA的sid:956b***和UserB的sid:e358***,这两个属性明显不同于上述对象ID


有人能向我解释一下这些sid来自哪里吗?

我在Azure AD访问令牌中没有找到任何直接的sid声明。实际上,oid将用于唯一标识用户。因此,我猜您获得的sid可能是会话id?您可以注销,然后使用相同的用途登录,以查看sid是否会为同一用户更改。我在Azure AD access令牌中未找到任何直接sid声明。实际上,oid将用于唯一标识用户。所以,我猜您得到的sid可能是会话id?您可以注销,然后使用相同的用法登录,以查看sid是否会为同一用户更改。
MobileServiceClient client;

client = new MobileServiceClient("https://application.azurewebsites.net");

var zumoPayload = new JObject()
{
    ["access_token"] = result.AccessToken
};

await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, zumoPayload);