c# - 如何使用服务用户凭据访问 Microsoft Graph 的服务

标签 c# azure asp.net-core microsoft-graph-api

我在 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 所需的权限,如下所示:

enter image description here

注意: 对于 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/

相关文章:

c# - 在 C# 中获取名称及其枚举值的好方法

c# - 如何删除级联底部的实体 -> EF中的非级联删除链?

php - 是否有可能通过 Microsoft App 注册构建通用登录系统?

node.js - Express 中的响应流在 Azure 应用服务中不起作用

asp.net-core - ASP.NET Core 在通过浏览器访问时看不到图像

c# - .NET Core/MVC - 查看将空模型发回 Controller

c# - 添加 Claims Transformer 后注入(inject)的 IPrincipal Claims 为空

c# HttpClient 只是停止而没有任何指示为什么

mysql - Azure Mysql HTTP REST API 。获取 JSON Web token

asp.net-core - 使用 ASP.Net 5 的 MVC 6 属性路由注册路由