我在 AAD 中创建了一个特殊服务帐户,我想用它向用户发送电子邮件通知。
在 asp.net core 2 Web 应用程序中,如何获取该服务帐户的访问 token ? 我见过的示例使用用户的身份,但这不是我的情况。
我可能会有一些后台进程,因此不能有任何用户交互。
最佳答案
I will have probably some background process, so there cannot be any user interactivity.
你可以使用OAuth 2 Resource Owner Password Credentials grant 。 注意:资源所有者密码授予不表示同意,也不支持 MFA。详细教程,可以关注here 。此外,您可以使用 ADAL 检索 access_token,而不是自己构建 HttpClient
。
通过 ADAL 获取 token 的代码如下所示:
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com","<clientId>", new UserPasswordCredential("<userName>", "<password>"));
此外,正如 juunas 评论的那样,您可以使用服务来服务场景并使用应用程序权限而不是用户委托(delegate)的权限。代码如下所示:
var result = await authContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential("<clientId>", "<clientSecrets>"));
对于 Azure 门户上的 AAD 应用,您需要配置访问 Microsoft Graph API 所需的权限,如下所示:
注意: 对于 Send mail Microsoft Graph 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);
}));
关于c# - 如何使用服务用户凭据访问 Microsoft Graph 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49153142/