2016-07-08 214 views
5

我有一个Azure网站上运行的标准Web API,启用了Azure AD身份验证,当在浏览器中浏览API时,我可以通过浏览器登录并访问该API。Azure AD API请求401未授权

的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帐户,但确信Service 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的帐户我有机会获得重建环境并仍然收到未经授权的回复(在浏览器中正常运行)。

+0

您可以在您的网站上发布代码Startup.Auth.cs设置Azure AD身份验证吗?或者,如果您在Azure网站中使用“身份验证/授权”选项,您可以共享您配置的值/设置吗? – Saca

+0

另外,对此:“身份验证是成功的,我可以在调试时看到用户信息。”,你是说当用Visual Studio运行WPF应用程序时,您成功连接到API,但是从exe运行时它不会' T'如果是这样,当您运行.exe时是否会收到提示? – Saca

+0

@Saca API正在使用Azure网站身份验证。提供程序是使用快速管理模式配置的“Azure Active Directory”,Azure AD App设置为AD Web Service应用程序。 – Anth12

回答

1

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

+0

对我来说也是一样我创建了另一个没有web api和azure认证的项目开箱即用 – KnuturO

2

我知道这已经过了几个月了,但我想抛出那里是什么原因导致这个问题,当我得到它,以及我发现我可以解决它。

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

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

这解决了我的问题。

希望这可以帮助其他任何人遇到此问题!

1

我也是越来越未经授权的错误,并获得不记名的令牌时,一切似乎工作得很好。

我的问题是在我的资源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”完全匹配。

注:

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