我正在使用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();
答案 0 :(得分:1)
问题是,返回使用的令牌不包含 其中的任何角色/ scp要求。
如果在decoded访问令牌中找不到任何角色/ scp声明。您需要再次在Azure门户中检查权限。
解码后的访问令牌应包含您授予的角色。
登录Azure门户->单击“ Azure Active Directory”->单击“应用程序注册(预览)”->查找您的应用程序。
单击您的应用程序-> API权限->检查您是否对应用程序具有管理员同意。如果没有,请单击“授予管理员同意”。
用于获取访问令牌的代码。您可以找到更多详细信息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());