有没有办法从 MS Graph 中提取给定企业应用程序的用户列表?我可以看到 Azure 门户正在发出此查询:
https://main.iam.ad.ext.azure.com/api/ManagedApplications/{enterprise-app-id}/AppRoleAssignments
谢谢!
我正在编写 python 代码,以使用 Microsoft Graph API 从 Outlook 发送电子邮件。为此,我在 Azure Active Directory 租户中创建了一个企业应用程序。我已向租户授予管理员对 Mail.Send 权限申请的同意。我可以借助此应用程序获取 Graph API 的访问令牌,但无法发送邮件。任何人都可以帮助我理解我的代码有什么问题吗?
Python代码:
from requests import post
CLIENT_SECRET_VALUE = 'CLIENT_SECRET_VALUE'
TENANT_ID = 'TENANT_ID'
CLIENT_ID = 'CLIENT_ID'
LOGIN_URI = f'https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token'
headers = {
'Host': 'login.microsoftonline.com',
'Content-Type': 'application/x-www-form-urlencoded'
}
body = {
'client_id': CLIENT_ID,
'scope': 'https://graph.microsoft.com/.default',
'client_secret': CLIENT_SECRET_VALUE,
'grant_type': 'client_credentials',
'tenant': TENANT_ID
}
response = post(url=LOGIN_URI, headers=headers, data=body)
response.raise_for_status()
response_body = response.json()
authorization_token = f"{response_body['token_type']} {response_body['access_token']}"
print(authorization_token)
email_header = {
'Authorization': authorization_token,
'Content-Type': 'application/json'
}
message …Run Code Online (Sandbox Code Playgroud) 我的第一个 Microsoft Graph 应用程序旨在下载服务邮箱的电子邮件附件,使用了DeviceCodeCredential身份验证类,如以下代码所示:
var credentials = new DeviceCodeCredential(
(info, cancel) => { Console.WriteLine(info.Message); return Task.FromResult(0); },
"12345678-1234-1234-1234-12345678" /*TenantId*/,
"99999999-9999-9999-9999-999999999999" /*ClientID*/
);
Run Code Online (Sandbox Code Playgroud)
我们向建造者提供了凭证GraphServiceClient;这工作得很好,也就是说我们可以枚举邮箱中的项目并下载附件(不包括这些操作的代码,因为它与问题无关)。
var graphServiceClient = new GraphServiceClient(
credentials,
new string [] {"Mail.Read", "Mail.ReadBasic", "Mail.ReadWrite"});
Run Code Online (Sandbox Code Playgroud)
然后我们切换到客户端秘密身份验证;我们为该应用程序生成了一个客户端密钥,并将凭证对象更改为ClentSecretCredential使用以下代码的对象:
var credentials = new ClientSecretCredential("12345678-1234-1234-1234-12345678" /*TenantId*/,
"99999999-9999-9999-9999-999999999999" /*ClientID*/,
"SOME8SECRET123GENERATEDBYAZURE" /*Client Secret*/);
Run Code Online (Sandbox Code Playgroud)
现在,当我们调用同一个GraphServiceClient构造函数时,我们会得到异常:
Azure.Identity.AuthenticationFailedException:ClientSecretCredential 身份验证失败:AADSTS1002012:为范围 Mail.Read Mail.ReadBasic Mail.ReadWrite 提供的值无效。客户端凭据流必须具有一个范围值,其后缀为 /.default 后缀为资源标识符(应用程序 ID URI)。
似乎需要进行更多更改才能从身份验证模式切换到另一个身份验证模式。但到底是什么?
嘿伙计们,我正在尝试获取租户中所有房间的列表,但我收到一个错误,我看不到解决方案。我的图形服务客户端似乎是正确的,因为我可以毫无问题地获取所有用户的列表,但获取所有房间失败并出现未知错误。
我想要复制的内容:https://learn.microsoft.com/en-us/graph/api/place-list ?view=graph-rest-1.0&tabs=csharp#request
创建图形客户端并尝试从地方获取房间列表
public GraphServiceClient CreateGraphClient()
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
// https://learn.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret, options);
return new GraphServiceClient(clientSecretCredential, scopes);
}
public async Task<List<string>> GetRoomsAsync()
{
var rooms = await graphClient.Places.Request().GetAsync();
var roomsList = new List<string>();
foreach (var room in rooms)
{
Console.WriteLine(room.DisplayName);
roomsList.Add(room.DisplayName);
}
return roomsList;
}
Run Code Online (Sandbox Code Playgroud)
当试图获取用户时,同样的事情也会发生。
public async Task<List<string>> GetUsersAsync()
{
var users = await graphClient.Users.Request().GetAsync(); …Run Code Online (Sandbox Code Playgroud) 组织管理员可以选择“代表您的组织同意”。
此功能使他们能够获得组织内所有用户的同意。因此,组织的用户无需提供个人同意即可注册。在 Microsoft 文档中,这称为管理员同意。
是否可以使用以下任何来源检查是否获得了组织范围的同意: