通过Microsoft Graph

时间:2019-04-24 12:37:48

标签: c# azure azure-active-directory microsoft-graph microsoft-graph-sdks

我正在使用Microsoft Graph SDK为我的应用程序(不是用户)获取访问令牌,以便从共享点进行读取。我一直在关注此document,并发布了此SO question。链接的SO中的代码是相同的。我能够在Azure门户中添加应用程序权限以及授予它们(通过按按钮)。问题是,返回使用的令牌中不包含任何角色/ scp声明。因此,在使用令牌时,我收到“令牌中需要包含scp或角色声明” 消息。

可以肯定的是,获取访问令牌时传递给我的范围的唯一值是:https://graph.microsoft.com/.default。我没有传递Sites.ReadWrite.All之类的任何东西(如果我仍然添加该作用域,则会出现异常)。我不确定如何继续进行故障排除,我们将不胜感激。

编辑:使用如下所示的图形SDK添加代码:

var client = new ConfidentialClientApplication(id, uri, cred, null, new SessionTokenCache());
var authResult = await client.AcquireTokenForClientAsync(new[] {"https://graph.microsoft.com/.default"});
var token = authResult.AccessToken;
var graphServiceClient = new GraphServiceClient(new DelegateAuthenticationProvider(async request => {request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token)}));
var drives = await graphServiceClient.Sites[<sharepoint_host>].SiteWithPath(<known_path>).Drives.Request().GetAsync(); 

2 个答案:

答案 0 :(得分:1)

  

问题是,返回使用的令牌不包含   其中的任何角色/ scp要求。

如果在decoded访问令牌中找不到任何角色/ scp声明。您需要再次在Azure门户中检查权限。

解码后的访问令牌应包含您授予的角色。

enter image description here

登录Azure门户->单击“ Azure Active Directory”->单击“应用程序注册(预览)”->查找您的应用程序。

enter image description here

单击您的应用程序-> API权限->检查您是否对应用程序具有管理员同意。如果没有,请单击“授予管理员同意”。

enter image description here

用于获取访问令牌的代码。您可以找到更多详细信息here

    //authority=https://login.microsoftonline.com/{tenant}/
    ClientCredential clientCredentials;
    clientCredentials = new ClientCredential("{clientSecret}");
    var app = new ConfidentialClientApplication("{clientId}", "{authority}", "{redirecturl}",
                                    clientCredentials, null, new TokenCache());
    string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
    AuthenticationResult result = null;
    result =  app.AcquireTokenForClientAsync(scopes).Result;
    Console.WriteLine(result.AccessToken);

答案 1 :(得分:1)

解决方案似乎像以另一种方式进行应用初始化:

var app = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, credentials, null, new TokenCache());