Azure AD API请求401未经授权

时间:2016-07-08 08:23:00

标签: c# .net asp.net-web-api azure-active-directory

我有一个在Azure网站上运行的标准Web API,启用了Azure AD身份验证,当在浏览器中浏览到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);

身份验证成功,我可以在调试时看到用户信息。

我无权访问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帐户中重新创建了环境,但仍然收到了未经授权的响应(在浏览器中正常工作)。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

这解决了我的问题。

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

答案 2 :(得分:2)

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

我的问题出在我的资源ID中。它与我的Azure-AD应用程序"应用程序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应用程序"应用程序ID URI"相匹配。究竟。

注意:

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

答案 3 :(得分:0)

只有我的5美分。有点晚了,但是如果这对某人有帮助,那就太棒了。

对我来说,问题是:没有正确发送范围和请求。

背景: 使用官方graph-api quickstart存储库的localhost节点服务器。 REST API服务器-使用Auth在Azure上运行的应用程序服务。 (快速模式)已启用。

我犯了一个严重错误,花了太长时间才弄清楚。我试图用错误的访问令牌调用API。

可以仅使用“ openid”,“ profile”等范围来调用GRAPH API。

但是要访问Web API,我必须使范围包括API url Scopes =“ https://yourwebsiteurl.com/allowed_scope”,而不仅仅是“ allowed_scope”。除非使用范围作为“ Application ID URI” / allowed_scope的Application ID URI都不起作用,除非API URL是“ Application ID URI”。

如果您尝试使用不存在或不存在的范围调用API,Azure会抛出一个明显的错误,但是在这种情况下,如果您没有在范围内包括真实的API网址-错误仅是401,什么也没有其他。

Azure中的“应用程序ID URI”配置实际上似乎没有什么区别,似乎几乎可以满足任何要求。 -API调用范围必须包含整个API网址。