我有一个在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
方法是失败。
我注意到 - (时间当然是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帐户中重新创建了环境,但仍然收到了未经授权的响应(在浏览器中正常工作)。
答案 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"相匹配。究竟。
注意:
答案 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网址。