我们的应用程序将执行简单的User.ReadBasic.All函数,根据我的理解,不需要管理员权限。 使用此处记录的流程:https://graph.microsoft.io/en-us/docs/authorization/app_only
POST https://login.microsoftonline.com/{tenantId}/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=<clientId>
&client_secret=<clientSecret>
&resource=https://graph.microsoft.com
我能够获得有效的访问令牌,但是在调用图表时会返回以下错误消息:
“code": "Authorization_IdentityNotFound", "The identity of the calling application could not be established."
我们已在管理控制台中设置我们的应用程序以获得User.ReadAll.Basic权限,有趣的是,当我使用自己的凭据/令牌缓存启动时,我确实从API获得了成功的结果具有appId和secret的ConfidentialClientApplication实例,并为令牌调用AcquireTokenSilentAsync:
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
tokenCache = new SessionTokenCache(
signedInUserID,
HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase);
ConfidentialClientApplication cca = new ConfidentialClientApplication(
appId,
redirectUri,
new ClientCredential(appSecret),
tokenCache);
但是我们正在创建一个没有用户交互的无状态无头服务,因此理想情况下我们不想回复用户凭据和令牌缓存以检索访问令牌。我不确定为什么一个场景有效,另一个是返回IdentityNotFound错误,欢迎你提出任何建议。
答案 0 :(得分:0)
根据我的理解,不需要管理员权限。
AFAIK,使用客户端凭据流时,我们需要为app设置应用程序权限,委托权限用于委派流程。
您可以尝试下面的代码来让用户使用ADAL:
string authority = "https://login.microsoftonline.com/a703965c-e057-4bf6-bf74-1d7d82964996";
AuthenticationContext authenticationContext = new AuthenticationContext(authority, false);
var result= await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential("clientid", "clientsecret"));
string sURL = "https://graph.microsoft.com/v1.0/users";
WebRequest request1 = WebRequest.Create(sURL);
request1.Method = "GET";
request1.Headers.Add("Authorization", "Bearer " + result.AccessToken);
HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
if (response1.StatusCode == HttpStatusCode.OK)
{
// some code
}
您可以设置&#34;阅读所有用户&#39;完整档案&#34; Microsfot Graph的应用许可(用于测试):