我正在尝试使用 ASP.NET Core Web App MVC 制作 MS Teams 选项卡应用程序。该应用需要图形客户端才能访问 SharePoint 资源。
我已经成功地实现了来自 Microsoft 的这个示例:https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-sso/csharp
因此应正确配置应用注册。
但是通过上述教程的身份验证,我无法在“ConfigureServices”方法中注入 Microsoft Graph Client。
因此,我尝试将本教程:https://docs.microsoft.com/en-us/graph/tutorials/teams?tutorial-step=4 实现为 MVC 应用程序。但是现在,当我尝试通过授权获取方法时,我不断收到 401 错误。
在配置方法中,“app.UseAuthentication()”也在“app.UseAuthorization()”之前
这是我的“ConfigureServices”方法
Project.dependencies()
这是我在 index.cshtml 中的 JS
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(Configuration.GetSection("Graph"))
.AddInMemoryTokenCaches();
}
这是我调用的“GetTest”方法
(function () {
if (microsoftTeams) {
microsoftTeams.initialize();
microsoftTeams.authentication.getAuthToken({
successCallback: (token) => {
$('<code/>', {
text: token,
style: 'word-break: break-all;'
}).appendTo('#tab-container');
fetch('/GetTest', {
method: 'get',
headers: {
"Content-Type": "application/text",
"Authorization": "Bearer " + token
}
}).then(response => {
response.text()
.then(body => {
$('#tab-container').empty();
$('<code/>', {
text: body
}).appendTo('#tab-container');
});
}).catch(error => {
console.error(error);
renderError(error);
});
},
failureCallback: (error) => {
renderError(error);
}
});
}
})();
在应用程序的这种状态下,该方法现在应该返回需要同意的 403 错误,但我只收到 401 Unauthorized 错误。
我不确定的是我是否可以使用与教程中相同的授权,因为我的项目是一个 MVC 项目。
答案 0 :(得分:0)
我不是这个主题的专家,但我认为您正在尝试将两种不同且不兼容的方法结合在一起。你不需要执行第二个教程中的步骤,因为 Teams SSO 已经为你提供了执行基本图形访问所需的一切。重要的是,Teams SSO 为您提供的令牌不能直接用于 Graph,它需要交换为“代表”(OBO)令牌,该令牌可用作 Graph 调用的 Bearer 令牌。
您链接的示例有代码可以为您完成此操作,位于“SSOAuthHelper”的 GetAccessTokenOnBehalfUserAsync
方法中。如果您想看到它的实际效果,请查看“HomeController”中的 GetUserAccessToken
方法。不是像 GetUserAccessToken
方法那样仅仅返回它,您实际上可以在控制器方法中使用它。例如,请参阅 this sample 中的 GetUserData
。