我目前正在使用此示例:
使用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初始化中出错。
答案 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服务器提供客户端凭据,而且有些服务器不接受这两种方式!
basic auth
标头,设置为Base64(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标头。即使没有支持资源,您也可以获得持有者令牌。
这很好 - 但很明显,在使用邮递员获取和存储你的令牌方面对你没有好处!
答案 1 :(得分:2)