Microsoft图获得访问权限,而无需用户获取日历事件

时间:2020-04-09 08:29:48

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

我创建了使用“无需用户访问权限”方案的ASP.Net MVC应用程序,并已使用管理员同意将所有需要的权限授予应用程序权限(Calendars.Read)。我已经可以获取令牌,并且可以使用该令牌成功获取用户个人资料。但是,当我尝试获取日历事件数据时,它将得到错误代码“ AuthenticationError”和错误消息“使用资源进行身份验证时出错”。我这样使用C#代码:

var events = await graphClient.Users[principalName].Events
            .Request()
            .GetAsync();

任何人都可以建议我错过了什么或应该使用什么权限?

我要获取身份验证的代码是这样的,最后我添加了“ WithExtraQueryParameters”以确保我使用的Grant_type是client_credentials

private static GraphServiceClient GetAuthenticated()
    {
        AuthenticationResult result = null;

        var query = new Dictionary<string, string>();
        query.Add("grant_type", "client_credentials");
        var idClient = ConfidentialClientApplicationBuilder
                            .Create(appId)
                            .WithAuthority(AzureCloudInstance.AzurePublic, $"{tenantId}")
                            .WithClientSecret(appSecret)
                            .WithExtraQueryParameters(query)
                            .Build();

        string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

        ClientCredentialProvider authenticationProvider = new ClientCredentialProvider(idClient);

        return new GraphServiceClient(new DelegateAuthenticationProvider(
            async (requestMessage) => {
                var accounts = await idClient.GetAccountsAsync();
                if (accounts.Any())
                {
                    result = await idClient.AcquireTokenSilent(graphScopes?.Split(','), accounts.FirstOrDefault()).ExecuteAsync();
                }
                else {
                    result = await idClient.AcquireTokenForClient(scopes).ExecuteAsync();
                }

                requestMessage.Headers.Authorization =
                    new AuthenticationHeaderValue("Bearer", result.AccessToken);
            }
        ));
    }

3 个答案:

答案 0 :(得分:0)

请尝试添加权限:Calendars.ReadWrite,OnlineMeetings.Read.All,OnlineMeetings.ReadWrite.All

答案 1 :(得分:0)

不知道您的代码出了什么问题。 我建议您使用Microsoft graph SDK。看看Microsoft graph auth。并且不要忘记Microsoft Identity client。将这两个软件包组合在一起将简化身份验证过程,并防止出现此类错误。

如果您决定使用它们。您的身份验证将如下所示:

Set

然后使用const errors = [{param: 1, val: "err1"}, {param: 2, val: "err2"}, {param: 3, val: "err3"}, {param: 2, val: "err4"}, {param: 1, val: "err5"}]; const { filteredParams } = errors.reduce((acc, e) => { !acc.foundParams.has(e.param) && (acc.foundParams.add(e.param) && acc.filteredParams.push(e)); return acc; }, {foundParams: new Set(), filteredParams: []}); console.log(filteredParams);创建对Microsoft图形的请求。让我知道是否有问题。

答案 2 :(得分:0)

var confidentialClient = ConfidentialClientApplicationBuilder
                .Create(clientId)
                .WithTenantId(tenantId)
                .WithClientSecret(clientSecret)
                .Build();

                var graphClient = new GraphServiceClient(new ClientCredentialProvider(confidentialClient));

                var evnts = await graphClient.Users["coyote@acme.com"].Events.Request().GetAsync();

当您的客户机密,租户匹配并且您已设置应用程序许可权时,此方法才起作用。

这是行不通的(我的@MS待处理票):

    var tasks = await graphClient.Users["coyote@acme.com"].Outlook.Tasks
.Request()
.GetAsync();

致谢