我正在创建一个Azure AD应用程序,该应用程序使用新的Yammer委托权限预览,使用我从Azure AD获得的访问令牌向Yammer发布消息。不幸的是,当尝试调用Yammer Rest api时,我得到了401 Unauthorized
响应。
var resourceId = "https://www.yammer.com";
var endpointUrl = "https://www.yammer.com/api/v1/messages/following.json";
AuthenticationHelper helper = new AuthenticationHelper();
helper.EnsureAuthenticationContext(AuthenticationHelper.AuthorityMultitenant, resourceId);
var token = helper.AuthenticationResult.AccessToken;
HttpClient hc = new HttpClient();
hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var result = await hc.GetAsync(new Uri(new Uri("https://www.yammer.com"), endpointUrl));
在这里我得到401 Unauthorized
,有一个消息"身份验证失败"。我也尝试了api.yammer.com而不是www.yammer.com,没有改变。我知道令牌正在被正确检索,因为我用其他Office 365 REST api测试了它们。
我的假设是令牌是一种不可接受的格式,但现在它应该接受Azure令牌,因为添加了委托权限。我是否使用了错误的资源ID和端点?
您的代码示例看起来是正确的。您的用户是否有活跃的Yammer订阅?
来自Yammer IT Pro Networks组对Office 365开发者的回答:
应用程序中的Yammer授权仍然完全独立于Office 365的其余部分。你需要创建一个Yammer应用在你的网络,而用户仍然需要点击同意对话框来授权。
是的,在Azure AD中有Yammer API的委托权限,但是除非我弄错了,否则这实际上并没有做任何事情。
这不是来自Yammer源代码,因为他们从不提供任何类型的开发人员支持或最新的文档,但这似乎完全有可能是另一个根本不起作用的"功能"。
我已经找到了解决问题的方法。Yammer的身份验证有两种配置方式,一种是将其配置为与Office 365的其他部分使用相同的身份验证,另一种是使用不同的配置。
如果使用Yammer自己的SSO(换句话说,Yammer有一个单独的ADFS配置),那么就会发生这个问题。如果你在你的网络中禁用Yammer单点登录,所有针对"映射"用户的Yammer认证将由Office365处理。完成后,您就可以使用Office 365 API了。