Azure移动服务错误:无法完成请求。 (未授权)

时间:2015-06-16 11:48:16

标签: c# authentication azure windows-phone-8.1 azure-mobile-services

我正在为该应用编写Windows Phone 8.1移动应用程序和数据源是Azure移动服务。

自从过去两天以来,我的登录功能停止了工作。现在它正在抛出请求无法完成。 (未经授权)错误。

我没有对登录服务如何停止进行任何更改感到惊讶?其他服务仍在运作。

填写错误堆栈跟踪:

  

请求无法完成。 (未授权)

     

{Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:   请求无法完成。 (未经授权)在   Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__18.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter.GetResult()
  在   Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__1d.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.<RequestAsync>d__4.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult()   在   Microsoft.WindowsAzure.MobileServices.MobileServiceClient.d__b.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Microsoft.WindowsAzure.MobileServices.MobileServiceClient.<InvokeApiAsync>d__0 2.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()   在MYAPP.SignIn.d__1.MoveNext()}

我的呼叫登录服务代码是:

var client = new MobileServiceClient("https://<My-Azure-Service>.azure-mobile.net/", "***KEY***");

var myLogin = new LoginRequest
                {
                    UserName = "username",
                    Password = "password",
                    DeviceToken = deviceID,
                    OSVersion = "WP 8",
                    AppVersion = "The major & minor version",
                    DeviceModel = "WP",
                    DeviceTypeID = 3
                };
                var loginResult = await client.InvokeApiAsync<LoginRequest, LoginResponse>("user/loguserin", myLogin, HttpMethod.Post, null);

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

未经授权的错误来自服务器,这可能是由于a)API的授权问题,或b)API代码中的问题。

后者是您必须与客户合作的事情。由于代码正在执行登录,因此很多情况可能会导致401 Unauthorized。这不是标准的移动服务登录功能,您的客户端可以控制执行的代码以及此时返回的错误。

谈到API的授权问题,移动服务允许API开发人员限制访问以下四个级别之一:

  • 每个人(或#34;匿名&#34;) - 任何人都可以访问的完全公共API(推荐用于登录端点)
  • 应用程序密钥 - 仅适用于提供应用程序密钥的人员。应用程序密钥由服务器提供,并且是原始帖子的代码中标记为***KEY***的值。此密钥附加到对移动服务的所有请求
  • 主密钥 - 仅供提供主密钥的人使用。主密钥由服务器提供,永远不会存储在设备代码中。
  • 经过身份验证的用户 - 仅适用于提供有效移动服务令牌的用户。此令牌通常是通过让用户通过其中一个受支持的第三方身份提供商登录获得的,但在这种情况下,令牌是由客户端代码基于他们维护的一些用户名和密码生成的。

如果API设置为其中之一,并且来自设备的呼叫不符合要求,则将返回401。您应该咨询您的客户,以了解他们将登录API设置为的授权级别。

很难说为什么这适用于iPhone / Android但不适用于WP。假设服务器代码没有问题,我会怀疑密钥不匹配问题(可能是某些设备代码库更新了密钥而不是其他设备代码库)或令牌验证问题。此登录调用可能附加了已过期的旧令牌。请检查是否是这种情况 - 使用Fiddler或类似的跟踪可以帮助您跟踪此情况。您甚至可以使用它来比较来自Android的呼叫。您还可以提前使用client.Logout()以确保没有令牌发送到登录端点。