邮差客户端凭证与Azure的AD保护的ressource

问题描述:

流我现在使用的这个例子邮差客户端凭证与Azure的AD保护的ressource

https://docs.microsoft.com/en-us/azure/active-directory/active-directory-authentication-scenarios#daemon-or-server-application-to-web-api

要检查客户端凭证通过OAuth在Azure的AD流动。理论上这个例子工作正常。客户端应用程序与服务器应用程序成功通信,首先从Azure AD令牌网址获取OAuth令牌。那里没有问题。但是,我试图使用Postman来检查客户端证书流程,但我无法使其工作。

在邮差,我应该提供一个访问令牌网址,一个客户端ID和,格兰特类型设置为客户端凭证一个客户端密钥。使用与https://github.com/Azure-Samples/active-directory-dotnet-daemon中微软样例提供的示例中相同的参数,当尝试访问Web服务时,我得到一个响应。我认为主要原因是因为在Postman中,我不能输入我想要访问的资源,所以收到的令牌没有“链接”到任何资源,这就是为什么授权在Web服务器中失败的原因?这可能是原因吗?如果这是原因,那么我应该怎样在服务器上做,因为在某种程度上,好像邮差的要求应该是客户端证书流程中的有效要求(我的意思是,根据OAuth2,不应该给出资源客户端凭证流,正确

这是样品中的Starup类从微软的下载例子的代码

// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseWindowsAzureActiveDirectoryBearerAuthentication(
      new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
      { 
       Audience = ConfigurationManager.AppSettings["ida:Audience"], 
       Tenant = ConfigurationManager.AppSettings["ida:Tenant"] 
      }); 
    } 

ConfigurationManager.AppSettings?[ “IDA:租客”]是我Azure的AD tentant,而 ConfigurationManager.AppSettings [“ida:Audienc e“]是我需要访问的受保护资源。这两个值都是必需的,如果我不提供Audience,我会在.net web api初始化中遇到错误。

我认为主要原因是因为在Postman中,我无法键入我想要访问的资源,所以收到的令牌没有“链接”到任何资源,这就是为什么授权在Web服务器中失败?这可能是原因吗?

你是对的。要通过客户端凭证流获取访问令牌,我们需要在请求中提供资源

你是什么意思,无法输入资源?资源参数是可以遏制它在人体内的参数,这里是你的参考图:

enter image description here

,并确保resrouce的价值是eaque用来保护观众配置资源。

+0

是的,当然,如果你是做一个直接的请求的OAuth2令牌网址。问题是我没有向Token URL发出请求,我正在向受Azure AD保护的REST服务发出请求,支持Client Credentials Flow。在这种情况下,Postman是向Token URL发出请求的邮件发送者,因为我使用Postman的内置授权功能(图像最左侧的授权选项卡),使用OAuth2请求令牌失败,因为在Postman's Auth对话框中,我看不到键入受保护资源的方法。 –

+0

根据我在Postman's Slack帐户中收到的回复: 在client_credentials流程中,client_id&client_secret在https://tools.ietf.org/html/rfc6749#section-4.4 中指定的Authorization标头中发送 这意味着根据OAuth规范,client_id和client_secret在授权标头中传输,与您提供的图像相反(这也是我的理解,因为您的示例正常工作,因为我在C#中创建的测试也如此),但他们发送这些参数在Body身上,而不是Auth头部)。我现在有点迷路了。 –

+0

Azure AD实现OAuth 2.0时有点不同,我们在上图中提供了body中的require参数。并且客户端凭证是相同的,无论您是将请求直接发送到令牌端点还是从受Azure AD保护的Web API发送请求。但在您的情况下,我们还需要提供令牌以通过授权访问受保护的Web API。然后在web api中,我们可以构建与邮递员相同的** Client Credential **流程。有关此流程的更多详细信息,请参阅[这里](https://graph.microsoft.io/en-us/docs/authorization/app_only)。 –

编辑

我认为问题是,Azure的令牌服务器不接受发送的Authorization头客户端凭据。例如

Authorization: Basic YmE1NTZlYmItZGY2OS00NjBhLWEwMjItNTI0NWQ0MzA2N2UxOmVxVzlqaXRobXF2cVFiVWY5dmxaWnhZN2wwUzZhQ0pHSkExSGt0eUd3N0W6 

但是这邮差的“获取新的访问令牌”工具怎样发送。所以这是行不通的。

如果您看Microsoft's documentation并搜索“获取令牌”,您将看到它意味着客户端凭证应在主体中提供。

POST /common/oauth2/v2.0/token HTTP/1.1 
Host: login.microsoftonline.com 
Content-Type: application/x-www-form-urlencoded 

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=qWgdYAmab0YSkuL1qKv5bPX&grant_type=client_credentials 

这工作正常,但似乎矛盾的Oauth 2.0 spec它说:

授权服务器必须支持HTTP基本认证 方案,用于验证发出一个客户端 密码的客户。

编辑完

你绝对可以得到承载令牌回而无需提供资源。

注意resource甚至没有正确地在前面回答的邮递员HTTP主体拼写 - 它拼写为resrource这就是为什么它的https://graph.microsoft.com值被忽略,不匹配的响应(00000002-0000-0000-c000-000000000000)发回的resource。虽然有趣,但它们都与api图形有关......但这是一个离题。

令人困惑的是,有两种方法将客户端凭证提供给Oauth 2.0服务器,并且一些服务器不接受这两种方式!

  • 1被添加basic auth头,其被设置为Base64(客户端Id + “:” + ClientSecret)
  • 2在请求的主体中添加的clientId和clientSecret。

我想这是使用OAuth 2.0 ... 看到的问题是一个规范,而不是一个协议 - https://tools.ietf.org/html/rfc6749#section-2.3.1

邮差的请求令牌UI(见下图)使用方法1,但Azure的身份验证服务器期望方法2.我知道是因为我跑了小提琴手,可以看到请求邮递员放在一起。

如果您手动将客户端凭据放在主体中,例如

grant_type = client_credentials &范围= &的client_id = ba556ebb-xxxx9-460a-ax2x-5245d43067e1 & client_secret = eqW9jighghghgvlZZxY7l0S6aCJGJA1HktyGw7E =

和不使用Basic Auth HTTP标头。即使没有 suppyling资源,你可以得到一个不记名的令牌。

这工作正常 - 但显然这对你使用邮差来获取和存储你的代币没有好处!

enter image description here

+1

我还没有仔细检查过这篇文章中的内容,但这是第一个合理的解释,为什么邮差仍然无法从Azure使用它的“Get New Access Token”对话框系统获取OAuth2令牌。如果这是正确的,它应该在邮递员中以某种方式可寻址,并且希望有一张票。我一直在寻找一个半天的答案,但没有找到答案。 – solvingJ