无法访问 Azure 移动应用中 JValue 的子值

Cannot access child value on JValue in Azure Mobile App

我最近使用 Azure 移动应用程序实现了自定义身份验证 - 所有服务器端都工作正常,而且我使用该移动应用程序服务的 Web 应用程序也工作正常。我使用 POSTMAN 和不同的场景详细测试了服务器端,一切正常,直到我尝试 LoginAsync on Xamarin.

当我在 POSTMAN 中传递电子邮件和密码时,我收到以下响应,清楚地表明它正在工作

但是当我使用 LoginAsync 从我的应用程序发送请求时,出现以下错误。

Cannot access child value on Newtonsoft.Json.Linq.JValue

我发送请求的代码非常简单,如下所示

public async Task<bool> Authenticate()
 {
   string username = "todo@gmail.com";
   string password = "todo";
   string message = string.Empty;
   var success = false;
   var credentials = new JObject
      {
       ["email"] = username,
       ["password"] = password
       };
   try
     {              
      MobileServiceUser user = await client.LoginAsync("CustomAuth", credentials);
      if (user != null)
        {
          success = true;
          CreateAndShowDialog("OK", "Auth");                 
        }
      }
      catch (Exception ex)
         {
           CreateAndShowDialog(ex, "Auth Error");                
          }

  return success;
 }

我是这样称呼它的

private MobileServiceClient client;
client = new MobileServiceClient(applicationURL);
await Authenticate();

知道为什么我会收到 Cannot access child value on Newtonsoft.Json.Linq.JValue 错误吗?

干杯

编辑POST

作为解决方法,我暂时将 InvokeApiAsyncJObject.FromObject 一起使用,而不是 LoginAsync

await client.InvokeApiAsync("/.auth/login/CustomAuth", JObject.FromObject(credentials), HttpMethod.Post, null);

我仍然不确定为什么 LoginAsync 不起作用 - 在找到解决方案之前,我将继续使用 InvokdeApiAsync 作为解决方法

AFAIK,您对 credentials 的初始化是正确的。对于以下错误:

Cannot access child value on Newtonsoft.Json.Linq.JValue

我通过 POSTMAN 查看了您的测试结果,发现您没有 return userId 给您的客户。 return提供给您的客户的基本属性如下所示:

{
   "authenticationToken":"***",
   "user":{
      "userId":"***"
   }
}

当使用MobileServiceClient.LoginAsync时,客户端SDK会内部调用MobileServiceAuthentication.cs下的LoginAsync()方法,如下:

JToken authToken = JToken.Parse(response);

// Get the Mobile Services auth token and user data
this.Client.CurrentUser = new MobileServiceUser((string)authToken["user"]["userId"]);

this.Client.CurrentUser.MobileServiceAuthenticationToken = (string)authToken[LoginAsyncAuthenticationTokenKey];

你会发现它会尝试提取user下的userId属性来构造MobileServiceUser实例并赋值给MobileServiceClient.CurrentUser