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();
我正在使用 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();