我正在为我的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,我没有看到任何教程做类似的步骤。那么我错过了什么让这个工作?
答案 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();