Authorization_IdentityNotFound 从守护程序应用程序访问 Microsoft Graph
Authorization_IdentityNotFound accessing Microsoft Graph from daemon application
我正在开发守护进程应用程序。我已经下载了示例应用程序以尝试查看它是否可以运行,但该应用程序也出现了同样的错误。我的管理员已经尽可能多地检查了他这一端,没有透露任何信息。期望的最终结果是有一个程序可以代表用户发送电子邮件并从某些邮箱中读取邮件。我还需要能够快速确认我的应用程序配置是否正确。
此程序不会有用户交互,将代表公司运行。
我做了什么:
- 在 aad.portal.azure.com 创建了应用程序注册。
- 创建了客户端密钥。
- 管理员已同意 11 个 Microsoft Graph 权限:Mail.Read(应用程序)、Mail.ReadBasic(应用程序)、Mail.ReadBasic.All(应用程序)、Mail.ReadWrite(申请),Mail.Send(申请),User.Export.All(申请),User.Invite.All(申请),User.ManageIdentities.All(申请),User.Read(委托) , User.Read.All (应用程序), User.ReadWrite.All (应用程序)
- 集成助手(预览版)显示除 1 项外的所有绿色,即 "Use certificate credentials instead of password credentials (client secrets)."。这个特别适合我。
- 在身份验证页面上,这不被视为 public 客户端。
使用的 Nuget 包:
- Microsoft.Identity.Client 4.13.0
- Microsoft.Graph 3.5.0
我的沙箱代码:
async void Main()
{
var graphFacade = new MsGraphFacade();
Console.WriteLine(await graphFacade.ValidateCredentialsAsync());
}
class MsGraphFacade
{
private static async Task<GraphServiceClient> GetGraphApiClient()
{
var clientId = "(Redacted)";
var secret = "(Redacted)";
var app = ConfidentialClientApplicationBuilder
.CreateWithApplicationOptions(new ConfidentialClientApplicationOptions{
ClientId = clientId,
ClientSecret = secret,
AadAuthorityAudience = AadAuthorityAudience.AzureAdMultipleOrgs,
})
.Build();
Console.WriteLine("Getting token");
var token = await app
.AcquireTokenForClient(new[] { "https://graph.microsoft.com/.default" })
.ExecuteAsync();
Console.WriteLine("Got token");
var accessToken = token.AccessToken;
var graphServiceClient = new GraphServiceClient(
new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
return Task.CompletedTask;
}));
Console.WriteLine("New client returned.");
return graphServiceClient;
}
public async Task<bool> ValidateCredentialsAsync()
{
try
{
Console.WriteLine("Attempting something simple");
var client = await GetGraphApiClient();
var user = await client.Users
.Request()
.Top(1)
.Select(x => x.DisplayName)
.GetAsync();
if (user != null)
{
return true;
}
return false;
}
catch (Exception e)
{
Console.WriteLine("2");
Console.WriteLine(e);
return false;
}
}
}
代码输出:
Attempting something simple
Getting token
Got token
New client returned.
2
Code: Authorization_IdentityNotFound Message: The identity of the calling application could not be established.
Inner error:
AdditionalData:
request-id: f31bc340-1cdf-485f-b852-f1e2822201ef
date: 2020-05-15T20:24:38
False
任何有关下一步检查或调整的想法都将不胜感激。
在此先感谢您的帮助。
我猜问题是你没有指定目标租户。
您是这样定义的:
AadAuthorityAudience = AadAuthorityAudience.AzureAdMultipleOrgs
您需要改为指定 Azure public 云 + 租户 GUID。我现在在 phone 上,所以我无法查找确切的语法:/
我正在开发守护进程应用程序。我已经下载了示例应用程序以尝试查看它是否可以运行,但该应用程序也出现了同样的错误。我的管理员已经尽可能多地检查了他这一端,没有透露任何信息。期望的最终结果是有一个程序可以代表用户发送电子邮件并从某些邮箱中读取邮件。我还需要能够快速确认我的应用程序配置是否正确。
此程序不会有用户交互,将代表公司运行。
我做了什么:
- 在 aad.portal.azure.com 创建了应用程序注册。
- 创建了客户端密钥。
- 管理员已同意 11 个 Microsoft Graph 权限:Mail.Read(应用程序)、Mail.ReadBasic(应用程序)、Mail.ReadBasic.All(应用程序)、Mail.ReadWrite(申请),Mail.Send(申请),User.Export.All(申请),User.Invite.All(申请),User.ManageIdentities.All(申请),User.Read(委托) , User.Read.All (应用程序), User.ReadWrite.All (应用程序)
- 集成助手(预览版)显示除 1 项外的所有绿色,即 "Use certificate credentials instead of password credentials (client secrets)."。这个特别适合我。
- 在身份验证页面上,这不被视为 public 客户端。
使用的 Nuget 包:
- Microsoft.Identity.Client 4.13.0
- Microsoft.Graph 3.5.0
我的沙箱代码:
async void Main()
{
var graphFacade = new MsGraphFacade();
Console.WriteLine(await graphFacade.ValidateCredentialsAsync());
}
class MsGraphFacade
{
private static async Task<GraphServiceClient> GetGraphApiClient()
{
var clientId = "(Redacted)";
var secret = "(Redacted)";
var app = ConfidentialClientApplicationBuilder
.CreateWithApplicationOptions(new ConfidentialClientApplicationOptions{
ClientId = clientId,
ClientSecret = secret,
AadAuthorityAudience = AadAuthorityAudience.AzureAdMultipleOrgs,
})
.Build();
Console.WriteLine("Getting token");
var token = await app
.AcquireTokenForClient(new[] { "https://graph.microsoft.com/.default" })
.ExecuteAsync();
Console.WriteLine("Got token");
var accessToken = token.AccessToken;
var graphServiceClient = new GraphServiceClient(
new DelegateAuthenticationProvider((requestMessage) =>
{
requestMessage
.Headers
.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
return Task.CompletedTask;
}));
Console.WriteLine("New client returned.");
return graphServiceClient;
}
public async Task<bool> ValidateCredentialsAsync()
{
try
{
Console.WriteLine("Attempting something simple");
var client = await GetGraphApiClient();
var user = await client.Users
.Request()
.Top(1)
.Select(x => x.DisplayName)
.GetAsync();
if (user != null)
{
return true;
}
return false;
}
catch (Exception e)
{
Console.WriteLine("2");
Console.WriteLine(e);
return false;
}
}
}
代码输出:
Attempting something simple
Getting token
Got token
New client returned.
2
Code: Authorization_IdentityNotFound Message: The identity of the calling application could not be established.
Inner error:
AdditionalData:
request-id: f31bc340-1cdf-485f-b852-f1e2822201ef
date: 2020-05-15T20:24:38
False
任何有关下一步检查或调整的想法都将不胜感激。
在此先感谢您的帮助。
我猜问题是你没有指定目标租户。
您是这样定义的:
AadAuthorityAudience = AadAuthorityAudience.AzureAdMultipleOrgs
您需要改为指定 Azure public 云 + 租户 GUID。我现在在 phone 上,所以我无法查找确切的语法:/