Microsoft graph API 使用客户端密码使用令牌身份验证发送电子邮件。我已将令牌粘贴到 https://jwt.ms/ 但缺少范围

Microsoft graph API to send Email using token authentication using client secret . I have pasted token in https://jwt.ms/ but missing scope

我正在使用 Graph API 发送电子邮件并使用 clientID、Secret 和 APPID。我正在获取令牌,但无法发送电子邮件:

Code: NoPermissionsInAccessToken Message: The token contains no permissions, or permissions can not be understood. Inner error: AdditionalData: requestId: 53f1cddb-4f38-4efa-ab62-624b495374f0 date: 2020-12-02T10:46:42 ClientRequestId: 53f1cddb-4f38-4efa-ab62-624b495374f0

我已添加 API 授权给 mail.send

IPublicClientApplication publicclientapplication = PublicClientApplicationBuilder
                     .Create(clientId)
                     .WithTenantId(tenantId)
                     .Build();
             
           UsernamePasswordProvider authprovider = new UsernamePasswordProvider(publicclientapplication,scopes);

            var authResult = await publicclientapplication
                    .AcquireTokenByUsernamePassword(scopes, username, passwordstring(stringpassword))
                    .ExecuteAsync().ConfigureAwait(false);
            return authResult.AccessToken;

我用来发送的代码是:

await graphServiceClient.Me .SendMail(email, false) .Request() .PostAsync();

请注意,委派权限用于应用程序+用户身份验证,而应用程序权限用于仅应用程序身份验证。

您应该使用了错误的 Microsoft Graph 身份验证提供程序,或者您添加了错误的权限类型。

现在您应该使用 Client credentials provider,它使用客户端凭证流和应用程序权限。但是您没有在 Azure AD 应用程序中添加 应用程序权限 。这就是您收到错误 The token contains no permissions 的原因。如果您的应用程序不需要用户登录,您可以使用此客户端凭据提供程序。但是你需要在AAD应用中添加应用权限而不是委托权限,并且记得使用graphServiceClient.Users["{id or userPrincipalName}"].SendMail发送邮件。

对于委托权限和graphServiceClient.Me端点,您应该选择Authorization code provider,这需要您实现交互式登录。继续使用委托权限和 graphServiceClient.Me.SendMail.

如果您不想以交互方式登录但希望在访问令牌中有一个用户,则需要选择Username/password provider. But it's not recommended by Microsoft. See Warning here。继续使用委托权限和 graphServiceClient.Me.SendMail

更新:

Username/password 提供商的样本:

IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantID)
            .Build();

UsernamePasswordProvider authProvider = new UsernamePasswordProvider(publicClientApplication, scopes);

GraphServiceClient graphClient = new GraphServiceClient(authProvider);

var email = "Your Username Here";
var str = "Your Password Here";
var password = new SecureString();
foreach (char c in str) password.AppendChar(c);

//prepare message and saveToSentItems here

await graphClient.Me
.SendMail(message,saveToSentItems)
.Request()
.PostAsync();

更新 2:

将应用程序权限 Mail.Send 添加到 Azure AD 应用程序中。

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithTenantId(tenantID)
    .WithClientSecret(clientSecret)
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);

//prepare message and saveToSentItems here

await graphClient.Users["{id or userPrincipalName}"]
    .SendMail(message,saveToSentItems)
    .Request()
    .PostAsync();