繁体   English   中英

Microsoft graph 无需用户即可访问以获取日历事件

[英]Microsoft graph get access without a user to get calendar events

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

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

谁能建议我错过了什么或我应该使用什么权限?

我获取身份验证的代码是这样的,最后我添加了“WithExtraQueryParameters”以确保我使用的grant_type is 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);
            }
        ));
    }

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

不知道你的代码有什么问题。 我可以建议您使用 Microsoft graph SDK。 看看Microsoft graph auth 并且不要忘记Microsoft Identity 客户端 结合这两个包将简化身份验证过程并防止您出现此类错误。

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

var app = ConfidentialClientApplicationBuilder.Create("client id")
                    .WithClientSecret("client secret")
                    .WithTenantId("your tenant id")
                    .WithAuthority(AadAuthorityAudience.AzureAdMyOrg)
                    .Build();
var authProvider = new ClientCredentialProvider(app);
var graphClient = new GraphServiceClient(authProvider);

然后使用graphClient创建对 microsoft graph 的请求。 如果 go 有什么错误,请告诉我。

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();

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM