C# Azure AD API请求401未经授权

C# Azure AD API请求401未经授权,c#,.net,asp.net-web-api,azure-active-directory,C#,.net,Asp.net Web Api,Azure Active Directory,我在启用Azure AD身份验证的Azure网站上运行标准Web API,在浏览器中浏览API时,我可以通过浏览器登录并访问API 但是,WPF桌面应用程序在提交请求时收到未经授权的响应: var authContext = new AuthenticationContext(authority, new FileCache()); var accessToken = await authContext.AcquireTokenAsync(apiResourceid, clientId, red

我在启用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网站中的“身份验证/授权”选项有关,启用后,Web Api将不接受使用身份验证标头的请求。禁用该选项并与Azure AD一起使用Owin库提供了所需的解决方案。

我知道这已经有几个月的历史了,但我想把我得到它时导致这个问题的原因以及我发现我可以做些什么来解决它

我有一个网站,我用信号器做的。在我开发的过程中,我没有保护这个网站,但是当我用AzureAD保护这个网站时,我遇到了前面提到的错误。问题是我有两个启动类,一个在应用程序根目录中,一个在App_Start中。一个位于[applicationname].App_启动命名空间中,一个位于App_启动命名空间中,一个标记为OWIN启动程序集

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

这解决了我的问题


希望这有助于任何其他遇到这种情况的人

我还遇到了未经授权的错误,在获得承载令牌时,一切似乎都正常工作

我的问题在于我的资源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关联的每个应用程序服务都有一个对应的Azure AD应用程序声明,类型为Web app/API。此资源id是应用程序服务的Azure AD应用程序声明中的“应用程序id URI”
  • 我的资源id恰好是我的网站URL,但它可能是任何东西。关键是要匹配您尝试访问的Azure广告应用程序的“应用程序ID URI”

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

      我的问题是:没有随请求一起正确发送作用域

      背景: 使用官方图形api快速启动repo的localhost节点服务器。 RESTAPI服务器-在azure上运行的应用程序服务,具有身份验证。(快速模式)已启用

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

      可以使用“openid”、“profile”等作用域调用GRAPH API

      但要访问web API,我必须使作用域包括API url scopes=“”,而不仅仅是“允许的范围”。即使使用作用域作为“Application ID URI”/allowed\u作用域的应用程序ID URI也不起作用,除非“Application ID URI”是API url

      如果您试图使用不存在的范围或类似的范围调用API,Azure将抛出一个明确的错误,但在这种情况下,如果您没有在范围内包含真实的API url,则错误仅为401,而不是其他


      Azure中的“应用程序ID URI”配置实际上似乎没有什么区别,似乎它几乎可以是任何东西。-而API调用范围必须包括整个API url。

      您可以在网站Startup.Auth.cs中发布代码来设置Azure AD Auth吗?或者,如果您正在Azure网站中使用“身份验证/授权”选项,您可以共享您配置的值/设置吗?此外,在该选项上:“身份验证成功,调试时我可以看到用户信息。”,您是说,当使用VisualStudio运行WPF应用程序时,您成功地连接到了API,但从exe运行时却没有?如果是这样的话,当您运行.exe时是否会得到提示?@Saca API正在使用Azure网站身份验证。提供程序是“Azure Active Directory”,它是使用快速管理模式配置的,Azure AD应用程序被设置为AD Web服务应用程序。@很遗憾,Saca在调试或运行exe时,API请求总是收到401。在这两种情况下,
      AcquireToken
      都是成功的。使用Pluralsight中配置为使用我的Azure AD的代码示例在本地工作,但当我部署到Azure时(并禁用automatica身份验证)客户端应用程序无法访问API。对我来说也是一样,我创建了另一个没有web API的项目,azure auth可以开箱即用