[英]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.