Xamarin.forms ZUMO登录(MobileServiceUser)的SID不同于用户';目标
我正在开发一个基于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客户端的: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主体
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
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
有人能向我解释一下这些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);