Azure AD API 请求 401 未经授权
Azure AD API request 401 Unauthorized
我在启用了 Azure AD 身份验证的 Azure 网站上有一个标准 Web API 运行,当在浏览器中浏览到 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 帐户中重新创建了环境,但仍然收到未经授权的响应(在浏览器中工作正常)。
问题似乎与 Azure 网站中的 "Authentication / Authorization" 选项有关,启用后 Web Api 将不接受使用身份验证 header 的请求。禁用该选项并将 Owin 库与 Azure AD 一起使用提供了所需的解决方案。
我知道这已经有几个月了,但我想在收到它时抛出导致这个问题的原因,以及我发现我可以解决它的方法。
我有一个使用 SignalR 制作的网站。在开发过程中,我没有保护站点,但是当我使用 AzureAD 保护站点时,我遇到了上述错误。问题是我有两个启动 类,一个在应用程序根目录中,另一个在 App_Start 中。一个在 [applicationname].App_Start 命名空间中,一个在 App_Start 命名空间中,一个被标记为 OWIN 启动程序集。
我的解决方案是删除位于 [appname].App_Start 命名空间中的 App_Start 文件夹中的那个,并将正确的 SignalR 和 OWIN 启动属性添加到 App_Start 文件夹中的那个应用程序根。
这解决了我的问题。
希望这对遇到此问题的其他人有所帮助!
我也遇到了未经授权的错误,在获取不记名令牌时,一切似乎都运行良好。
我的问题出在我的资源 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 类型的 Azure-AD 应用程序声明 app/API。此资源 ID 是应用服务的 Azure-AD 应用程序声明中的 "App ID URI"。
- 我的资源 ID 恰好是我的网站 URL,但它可以是任何东西。关键是匹配您尝试访问的 Azure-AD 应用程序的 "APP ID URI"。
只是我的 5 美分。有点晚了,但如果这对某人有帮助,那就太棒了。
我遇到的问题是:没有随请求正确发送范围。
背景:
使用官方 graph-api quickstart repo 的本地主机节点服务器。
REST API-server - Azure 上的应用服务 运行,带有 Auth。 (快速模式)已启用。
我犯了一个严重的错误,花了很长时间才弄明白。我试图用错误的访问令牌调用 API。
可以仅使用 "openid"、"profile" 等范围调用 GRAPH API。
但是要访问网络 API,我必须让范围包括 API url 范围 = "https://yourwebsiteurl.com/allowed_scope" 而不仅仅是 "allowed_scope".即使使用 "Application ID URI"/allowed_scope 范围的应用程序 ID URI 也不起作用,除非 "Application ID URI" 是 API url.
如果您尝试使用不存在的范围调用 API,Azure 会抛出一个明显的错误,但在这种情况下,如果您不包含真正的 API url 在范围内 - 错误只是 401,没有别的。
Azure 中的 "Application ID URI" 配置实际上似乎没有什么不同,似乎几乎可以是任何东西。 - 而 API 调用范围必须包括整个 API url.
花了几个小时试图弄清楚问题是什么,通常当问题发生时,事情很简单。 Postman 提供 RestSharp C# 代码,如果您使用的是 HttpClient,那只是格式问题。使用:
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer tokenValueLongStringHere);
在我的情况下使用 httpClient.DefaultRequestHeaders.Authorization 无效。
对我来说,这只是一个使用错误“秘密”的情况,即我不小心使用了 SecretID 而不是秘密的值。
这让我能够获得一个没有错误消息的代码,但该代码实际上无效,即使它看起来像一个正确的代码,我得到的只是臭名昭著的 401,不知道为什么正在发生。
我在启用了 Azure AD 身份验证的 Azure 网站上有一个标准 Web API 运行,当在浏览器中浏览到 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
方法失败。
我确实注意到 -(时间是当然 UTC)AuthenticationResult.ExpiresOn
总是过去的,但看不到延长它的方法,这应该是未来的日期吗?
要求:
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 帐户中重新创建了环境,但仍然收到未经授权的响应(在浏览器中工作正常)。
问题似乎与 Azure 网站中的 "Authentication / Authorization" 选项有关,启用后 Web Api 将不接受使用身份验证 header 的请求。禁用该选项并将 Owin 库与 Azure AD 一起使用提供了所需的解决方案。
我知道这已经有几个月了,但我想在收到它时抛出导致这个问题的原因,以及我发现我可以解决它的方法。
我有一个使用 SignalR 制作的网站。在开发过程中,我没有保护站点,但是当我使用 AzureAD 保护站点时,我遇到了上述错误。问题是我有两个启动 类,一个在应用程序根目录中,另一个在 App_Start 中。一个在 [applicationname].App_Start 命名空间中,一个在 App_Start 命名空间中,一个被标记为 OWIN 启动程序集。
我的解决方案是删除位于 [appname].App_Start 命名空间中的 App_Start 文件夹中的那个,并将正确的 SignalR 和 OWIN 启动属性添加到 App_Start 文件夹中的那个应用程序根。
这解决了我的问题。
希望这对遇到此问题的其他人有所帮助!
我也遇到了未经授权的错误,在获取不记名令牌时,一切似乎都运行良好。
我的问题出在我的资源 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 类型的 Azure-AD 应用程序声明 app/API。此资源 ID 是应用服务的 Azure-AD 应用程序声明中的 "App ID URI"。
- 我的资源 ID 恰好是我的网站 URL,但它可以是任何东西。关键是匹配您尝试访问的 Azure-AD 应用程序的 "APP ID URI"。
只是我的 5 美分。有点晚了,但如果这对某人有帮助,那就太棒了。
我遇到的问题是:没有随请求正确发送范围。
背景: 使用官方 graph-api quickstart repo 的本地主机节点服务器。 REST API-server - Azure 上的应用服务 运行,带有 Auth。 (快速模式)已启用。
我犯了一个严重的错误,花了很长时间才弄明白。我试图用错误的访问令牌调用 API。
可以仅使用 "openid"、"profile" 等范围调用 GRAPH API。
但是要访问网络 API,我必须让范围包括 API url 范围 = "https://yourwebsiteurl.com/allowed_scope" 而不仅仅是 "allowed_scope".即使使用 "Application ID URI"/allowed_scope 范围的应用程序 ID URI 也不起作用,除非 "Application ID URI" 是 API url.
如果您尝试使用不存在的范围调用 API,Azure 会抛出一个明显的错误,但在这种情况下,如果您不包含真正的 API url 在范围内 - 错误只是 401,没有别的。
Azure 中的 "Application ID URI" 配置实际上似乎没有什么不同,似乎几乎可以是任何东西。 - 而 API 调用范围必须包括整个 API url.
花了几个小时试图弄清楚问题是什么,通常当问题发生时,事情很简单。 Postman 提供 RestSharp C# 代码,如果您使用的是 HttpClient,那只是格式问题。使用:
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer tokenValueLongStringHere);
在我的情况下使用 httpClient.DefaultRequestHeaders.Authorization 无效。
对我来说,这只是一个使用错误“秘密”的情况,即我不小心使用了 SecretID 而不是秘密的值。
这让我能够获得一个没有错误消息的代码,但该代码实际上无效,即使它看起来像一个正确的代码,我得到的只是臭名昭著的 401,不知道为什么正在发生。