J'ai un environnement Exchange Online et une application service/daemin (aucun utilisateur interactif) sur la machine virtuelle Azure. Le service utilise l'API gérée EWS pour travailler avec les e-mails dans la boîte aux lettres de tout utilisateur locataire. Désormais, le client EWS utilise l'authentification de base qui, selon Microsoft, ne sera plus prise en charge dans EWS pour accéder à Exchange Online.
Donc, je dois trouver un moyen d'obtenir un jeton d'accès valide pour l'application de service/démon à utiliser avec l'API gérée EWS.
L'exemple suivant article montre un exemple d'utilisation de OAuth 2.0 avec l'API gérée par EWS. Cet exemple fonctionne, mais il utilise une méthode interactive pour obtenir le consentement (un formulaire de connexion apparaît permettant l'utilisateur s'authentifie et accorde l'autorisation demandée à l'application) qui ne convient pas au scénario d'application de service/démon, car il n'y a pas d'utilisateur interactif.
Pour l'application de service/démon, je dois utiliser client credential
flux d'authentification.
En utilisant le compte administrateur sur https://aad.portal.Azure.com portail, j'ai enregistré l'application avec Azure Active Directory. Secret client ajouté pour l'application enregistrée.
Ci-dessus article utilise https://Outlook.office.com/EWS.AccessAsUser.All
en tant que scope
. Mais je n'ai pas trouvé d'autorisation avec une telle URL sur le portail. Je n'ai trouvé que les autorisations suivantes sous Office 365 Exchange Online
> Application permissions
> Mail
:
https://Outlook.office365.com/Mail.Read
Permet à l'application de lire le courrier dans toutes les boîtes aux lettres sans utilisateur connectéhttps://Outlook.office365.com/Mail.ReadWrite
Permet à l'application de créer, lire, mettre à jour et supprimer du courrier dans toutes les boîtes aux lettres sans utilisateur connecté.J'ai ajouté les deux et accordé le consentement de l'administrateur à tous les utilisateurs.
À des fins de test et de simplicité, je n'ai utilisé aucune bibliothèque d'authentification (ADAL, MSAL, etc.). J'ai utilisé Postman pour obtenir un jeton d'accès, puis j'ai défini la variable token
dans le débogage (voir l'extrait de code plus loin dans l'article).
J'ai essayé différents points de terminaison pour obtenir un jeton d'accès.
POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token
grant_type=client_credentials
client_id=***
client_secret=***
scope=https://Outlook.office.com/EWS.AccessAsUser.All
L'envoi de cette demande produit la réponse d'erreur suivante:
AADSTS70011: La demande fournie doit inclure un paramètre d'entrée "scope". La valeur fournie pour le paramètre d'entrée "scope" n'est pas valide. La portée https://Outlook.office.com/EWS.AccessAsUser.All n'est pas valide.
J'ai essayé de remplacer scope
par https://Outlook.office.com/.default
. Le jeton d'accès a été retourné, mais il semble non valide pour EWS. Le client EWS génère une erreur 401 avec la valeur suivante de x-ms-diagnostics
en-tête de réponse:
2000008; reason = "Le jeton ne contient aucune autorisation ou les autorisations ne peuvent pas être comprises."; Error_category = "invalid_grant"
POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/token
grant_type=client_credentials
client_id=***
client_secret=***
resource=https://Outlook.office.com
Le jeton d'accès a été retourné, mais semble également non valide pour EWS. Le client EWS renvoie une erreur 401 avec la même valeur de x-ms-diagnostics
en-tête de réponse comme décrit précédemment dans # 1.
Voici un exemple de code que j'ai utilisé pour tester le client EWS avec un jeton d'accès acquis dans Postman:
var token = "...";
var client = new ExchangeService
{
Url = new Uri("https://Outlook.office365.com/EWS/Exchange.asmx"),
Credentials = new OAuthCredentials(token),
ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress,
"[email protected]"),
};
var folder = Folder.Bind(client, WellKnownFolderName.SentItems);
Je rencontre le même problème en suivant les documents officiels de Microsoft pour flux d'informations d'identification du client OAuth 2.
Selon la plate-forme d'identité Microsoft et le flux d'informations d'identification du client OAuth 2. , la portée "doit être l'identificateur de ressource (URI de l'ID d'application) de la ressource que vous souhaitez, apposée avec le suffixe .default "(voir doc de portée par défaut ).
La question est donc de savoir comment convertir https://Outlook.office.com/EWS.AccessAsUser.All
dans l'identificateur de ressource.
Expérimentalement, je parviens à le faire fonctionner en utilisant scope=https://Outlook.office365.com/.default
. J'ai accordé full_access_as_app
(Office 365 Exchange Online/Autorisations d'application) et obtenu le consentement de l'administrateur pour cela.
J'ai rencontré ce problème lors de l'implémentation de OAuth pour EWS. Mon application est pas à l'aide de EWS Managed API . Voici tout ce que j'ai fait pour le faire fonctionner.
Office 365 Exchange Online > full_access_as_app
à l'application.https://Outlook.office365.com/.default
.POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
form-data = {
client_id,
client_secret,
grant_type: 'client_credentials',
scope: 'https://Outlook.office365.com/.default',
};
Authorization
et ExchangeImpersonation
SOAP en-tête à la demande).<SOAP-ENV:Header>
<t:ExchangeImpersonation>
<t:ConnectingSID>
<t:PrimarySmtpAddress>[email protected]</t:PrimarySmtpAddress>
</t:ConnectingSID>
</t:ExchangeImpersonation>
</SOAP-ENV:Header>