azure-mobile-apps在调用invokeApi时收到401错误

时间:2017-03-25 13:04:35

标签: cordova ionic2 google-oauth azure-mobile-services asp.net-core-webapi

我正在为我的Api(ASP.NET Core)使用Azure应用服务,我有一个像这样的Api控制器

[Route("api")]
public class PingController : Controller
{
    [HttpGet]
    [Route("ping")]
    public string Ping()
    {
        return "Pong";
    }

    [Authorize]
    [HttpGet("claims")]
    public object Claims()
    {
        return User.Claims.Select(c =>
        new
        {
            Type = c.Type,
            Value = c.Value
        });
    }
}

然后我试图从像这样的Ionic2(TypeScript& Cordova)实现中访问它

this.client = new WindowsAzure.MobileServiceClient('https://mysite.azurewebsites.net/');
 this.client.login('google').then(result=>{
    this.client.invokeApi("claims", {
        body: null,
        method: "get"
    }).done(function (results) {
        alert(JSON.stringify(results));
    }, function (error) {
        let msg = error.message;
        let request = error.request;
        alert(msg+';'+request.status);
    });
});

登录屏幕正确显示并且服务被调用,但因401错误而失败。如果我调用'ping'服务,它就有效。 HTTP调用有X-ZUMO标头,我认为它应该适用于身份验证(?):

GET /api/claims HTTP/1.1
Host: mysite.azurewebsites.net
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
ZUMO-API-VERSION: 2.0.0
X-ZUMO-INSTALLATION-ID: 10badf87-...
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
X-ZUMO-AUTH: eyJ0eXAiOiJKV...
accept: application/json
X-ZUMO-VERSION: ZUMO/2.0 (lang=Cordova; os=--; os_version=--; arch=--; version=2.0.0-41128.193844)
Referer: http://localhost:8000/index.html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8
Cookie: ARRAffinity=4df5cc005....

Azure应用调试日志只显示IIS的默认401屏幕。说该资源已被访问为“匿名”。 我以前使用过Auth0,你必须在app配置中注册JWT Bearer选项。但是对于Azure,我没有看到任何教程做类似的步骤。那么我错过了什么让这个工作?

2 个答案:

答案 0 :(得分:1)

我在这里写了关于ASP.NET Core中的App Service:https://shellmonger.com/2017/03/02/azure-app-service-authentication-in-an-asp-net-core-application/

基本上 - 您需要在.NET Core中处理令牌。它不是原生的。

答案 1 :(得分:0)

花了好几个小时后,我意识到App Services没有填充ASP.NET核心应用程序的声明主体。这意味着它不处理X-ZUMO标头并验证它们。

看看这个SO Question

建议的解决方案是使用X-ZUMO标头调用/.auth/me服务,该服务返回所有声明并使用响应在ASP.NET Core应用程序中设置身份验证上下文。

这个GitHub存储库现在使这很容易做到。它定义了一个扩展方法,以便您可以通过调用

为您的应用程序实现这一点
  

app.UseAzureAppServiceAuthentication();