邮件客户端凭据流与Azure AD保护的资源

时间:2016-11-16 20:23:30

标签: .net authentication asp.net-web-api oauth-2.0 azure-active-directory

我目前正在使用此示例:

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

使用Azure AD中的OAuth检查客户端凭据流。从理论上讲,这个例子可行。客户端应用程序成功与服务器App通信,首先从Azure AD令牌URL获取OAuth令牌。没有问题。但是,我正在尝试使用Postman检查客户端凭据流,但我无法使其工作。

在Postman中,我应该提供访问令牌网址客户端ID 客户端密钥授权类型设置为客户端凭据。使用与https://github.com/Azure-Samples/active-directory-dotnet-daemon中的Microsoft示例提供的示例中相同的参数,我在尝试访问Web服务时收到 401 响应。我认为主要原因是因为在邮递员中,我无法输入我想要访问的资源,因此收到的令牌不会“链接”到任何资源,这就是授权在网络中失败的原因服务器?这可能是原因吗?如果这就是原因,那么我应该在服务器上做什么,因为,不知何故,似乎Postman的要求应该是客户证书流程中有效的要求(我的意思是,不应该给出资源 ,根据OAuth2客户端凭证流程,对吗?

这是从Microsoft示例

下载的示例中的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:Tenant”] 是我的Azure AD帐篷,而 ConfigurationManager.AppSettings [“ida:Audience”] 是我需要访问的受保护资源。这两个值都是必需的,如果我不提供Audience,我会在.NET Web API初始化中出错。

2 个答案:

答案 0 :(得分:3)

修改

我认为问题是Azure令牌服务器不接受作为授权标头发送的客户端凭据。 e.g。

Authorization: Basic YmE1NTZlYmItZGY2OS00NjBhLWEwMjItNTI0NWQ0MzA2N2UxOmVxVzlqaXRobXF2cVFiVWY5dmxaWnhZN2wwUzZhQ0pHSkExSGt0eUd3N0W6

但这就是Postman"获取新访问令牌"工具发送它。所以它不会起作用。

如果您查看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被忽略,与回复resource中发回的(00000002-0000-0000-c000-000000000000)不符。虽然有趣,但它们都与api图有关......但那是一个题外话。

令人困惑的是,有两种方法可以向Oauth 2.0服务器提供客户端凭据,而且有些服务器不接受这两种方式!

  • 1添加basic auth标头,设置为Base64(ClientId + ":" + ClientSecret)
  • 2是在请求正文中添加clientId和clientSecret。

我想这就是Oauth 2.0是规范而不是协议的问题...... 见 - https://tools.ietf.org/html/rfc6749#section-2.3.1

Postman的请求令牌UI(见下图)使用方法1,但Azure auth服务器需要方法2.我知道因为我运行了fiddler,并且可以看到请求邮递员放在一起。

如果您手动将客户端凭据放入正文中,例如

grant_type = client_credentials& scope =& client_id = ba556ebb-xxxx9-460a-ax2x-5245d43067e1& client_secret = eqW9jighghghgvlZZxY7l0S6aCJGJA1HktyGw7E =

并且不使用Basic Auth http标头。即使没有支持资源,您也可以获得持有者令牌。

这很好 - 但很明显,在使用邮递员获取和存储你的令牌方面对你没有好处!

enter image description here

答案 1 :(得分:2)

  

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

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

你不能输入资源是什么意思? resource参数是我们可以在正文中包含它的参数,这里是一个供您参考的图:

enter image description here

并确保resrouce的值对用于保护资源的受众配置不明确。