我有一个Xamarin Forms应用程序,它使用AD B2C进行身份验证,然后在Azure移动应用程序服务中调用API。应用程序服务是使用.NET创建的,并从数据库返回特定于用户的数据。问题是我在TableController服务中获得的用户ID与自定义API控制器服务中的用户ID不同。这两个服务都使用Authorize属性进行设置。
第一个电话是移动应用服务TableController api,它使用以下代码确定用户ID:
((ClaimsPrincipal)用户).FindFirst(ClaimTypes.NameIdentifier)。价值。
客户的主要步骤如下: 1.从AD B2C获取令牌:PublicClientApplication.AcquireTokenAsync() 2.使用令牌登录移动应用服务:MobileServiceClient.LoginAsync(在有效负载中传递令牌) 3.调用移动应用服务TableController API:IMobileServiceTable.ToEnumerableAsync()
这似乎很好。在表控制器中,从NameIdentifier声明中检索用户ID的值。此时的值始终采用以下格式:" sid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" (x是十六进制字符)。
然后客户端调用另一个服务,该服务是ApiController(具有MobileAppController属性)。该服务使用与上面相同的代码来获取用户ID(来自NameIdentifier声明)。但是检索的用户ID与TableController检索的用户ID不同。
客户端代码基本如下:
authResult = await B2CPublicClientApp.AcquireTokenAsync();
string url = [endpoint for the custom api]
HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, url);
message.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.IdToken);
HttpResponseMessage response = await client.SendAsync(message);
string responseString = await response.Content.ReadAsStringAsync();
对自定义API端点的调用成功并且已成功授权,但用户ID不同。用户标识的格式为: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx其中x是十六进制字符。
显然,每次调用任何应用服务器服务时,我都需要一个用户拥有相同的用户ID。