我在AAD中创建了一个特殊服务帐户,我想用它向用户发送电子邮件通知。
在asp.net core 2 web app中,如何获取该服务帐户的访问令牌? 我见过的样本使用了用户的身份,但这不是我的情况。
我可能会有一些后台进程,因此无法进行任何用户交互。
答案 0 :(得分:3)
我可能会有一些后台进程,因此无法进行任何用户交互。
您可以使用OAuth 2 Resource Owner Password Credentials grant。 注意:资源所有者密码授予不提供同意,也不支持MFA。详细教程,您可以关注here。此外,您可以使用ADAL来检索access_token,而不是自己构建HttpClient
。
通过ADAL获取令牌的代码如下所示:
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com","<clientId>", new UserPasswordCredential("<userName>", "<password>"));
此外,由于juunas评论说您可以使用服务来提供服务方案并使用应用程序权限而不是用户委派的权限。代码如下所示:
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential("<clientId>", "<clientSecrets>"));
对于Azure Portal上的AAD应用,您需要配置访问Microsoft Graph API所需的权限,如下所示:
注意:对于Send mail Microsoft图形API,您需要设置相关权限。对于资源所有者密码凭据授予流程,您需要选择委派权限以用户身份发送邮件(Mail.Send)。对于客户端凭据流,您需要选择应用程序权限以任何用户身份发送邮件(Mail.Send),然后单击授予权限(此权限需要全局管理员同意)。
检索access_token后,您可以使用Microsoft Graph Client Library for .NET与Microsoft Graph API进行通信以发送电子邮件。 GraphServiceClient
的初始化如下所示:
//initialize the GraphServiceClient instance
var graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
var token = await GetAccessTokenAsync();
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));