Azure AD API请求401未经授权

我有一个在Azure网站上运行的标准Web API,启用了Azure AD身份validation,当在浏览器中浏览到API时,我可以通过浏览器登录并获得对API的访问权限。

然而,WPF桌面应用程序在提交请求时收到未经授权的响应:

var authContext = new AuthenticationContext(authority, new FileCache()); var accessToken = await authContext.AcquireTokenAsync(apiResourceid, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto)); // accessToken is valid var apiUrl = "https://example.azurewebsites.net/api/list"; var request = new HttpRequestMessage(HttpMethod.Get, apiUrl); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.AccessToken); var response = await httpClient.SendAsync(request); 

validation成功,我可以在调试时看到用户信息。

我无权访问Azure帐户,但我确信服务AD应用程序已正确配置以允许访问客户端AD应用程序,因为在备用帐户(未正确配置)上进行测试时, AuthenticationContext.AcquireTokenAsync方法失败。

我注意到AuthenticationResult.ExpiresOn总是在过去,但是如果这是未来的日期,则无法扩展它吗? – (时间当然是UTC)

请求:

 GET https://example.azure websites.net/api/categorisation HTTP/1.1 Authorization: Bearer eyJ0eXAiO... Host: example.azurewebsites.net 

响应:

 HTTP/1.1 401 Unauthorized Content-Length: 58 Content-Type: text/html Server: Microsoft-IIS/8.0 WWW-Authenticate: Bearer realm="example.azurewebsites.net" X-Powered-By: ASP.NET Set-Cookie: ARRAffinity=e35f2977dba55e6708887e762940f75c2a0fcb0a9df4e1cbe0d3f10a614c59b8;Path=/;Domain=example.azurewebsites.net Date: Fri, 08 Jul 2016 07:51:13 GMT You do not have permission to view this directory or page. 

更新:

我已经在我有权访问的Azure帐户中重新创建了环境,并且仍然收到了未经授权的响应(在浏览器中正常工作)。

我知道这已经有几个月了,但是当我得到这个问题时,我想扔出那个引起这个问题的东西,以及我发现我能解决的问题。

我有一个我使用SignalR的网站。 在我开发的时候,我没有保护网站,但是当我用AzureAD保护网站时,我得到了上述错误。 问题是我有两个启动类,一个在应用程序根目录中,另一个在App_Start中。 一个在[applicationname] .App_Start命名空间中,而一个在App_Start命名空间中,一个被标记为OWIN启动程序集。

我的解决方法是删除App_Start文件夹中的那个,该文件夹位于[appname] .App_Start命名空间中,并将正确的SignalR和OWIN启动属性添加到应用程序根目录中。

这解决了我的问题。

希望这可以帮助其他任何人遇到这个!

问题似乎与Azure网站中的“身份validation/授权”选项有关,启用后,Web Api将不接受使用身份validation标头的请求。 禁用该选项并使用Owin库和Azure AD一起提供了所需的解决方案。

我也遇到了未经授权的错误,当获得持票人令牌时,一切似乎都运转正常。

我的问题在于我的资源ID。 它与我的Azure-AD应用程序的“App ID URI”不匹配。 在调用AcquireTokenAsync方法时,我在结尾处有一个额外的斜杠,我在Azure-AD中输入了它而没有斜杠。

 // private string resourceId = "https://mywebsite.azurewebsites.net/"; // bad private string resourceId = "https://mywebsite.azurewebsites.net"; // good result = await authContext.AcquireTokenAsync(resourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Never)); 

因此,请确保您的资源ID与Azure-AD应用程序的“App ID URI”完全匹配。

笔记:

  • 与Azure-AD关联的每个应用程序服务都具有Web app / API类型的相应Azure-AD应用程序声明。 此资源ID是应用服务的Azure-AD应用程序声明中的“App ID URI”。
  • 我的资源ID恰好是我的网站URL,但它可能是任何东西。 重点是匹配您尝试访问的Azure-AD应用程序的“APP ID URI”。