MSTeams 选项卡 ASP.NET Core MVC 应用程序身份验证与不记名令牌未授权错误

时间:2021-06-24 09:25:58

标签: c# asp.net-core-mvc microsoft-graph-api microsoft-teams

我正在尝试使用 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 项目。

1 个答案:

答案 0 :(得分:0)

我不是这个主题的专家,但我认为您正在尝试将两种不同且不兼容的方法结合在一起。你不需要执行第二个教程中的步骤,因为 Teams SSO 已经为你提供了执行基本图形访问所需的一切。重要的是,Teams SSO 为您提供的令牌不能直接用于 Graph,它需要交换为“代表”(OBO)令牌,该令牌可用作 Graph 调用的 Bearer 令牌。

您链接的示例有代码可以为您完成此操作,位于“SSOAuthHelper”的 GetAccessTokenOnBehalfUserAsync 方法中。如果您想看到它的实际效果,请查看“HomeController”中的 GetUserAccessToken 方法。不是像 GetUserAccessToken 方法那样仅仅返回它,您实际上可以在控制器方法中使用它。例如,请参阅 this sample 中的 GetUserData

相关问题