Avant de parler de Modern Authentication, parlons de Basic Authentication.
La Basic Authentication signifie simplement que l’application envoie un nom d’utilisateur et un mot de passe à chaque requête, et que ces informations d’identification sont également souvent stockées ou enregistrées sur l’appareil.
Qu’est-ce que cela implique ?
- Le Username et le Password vont passer sur le réseau à chaque tentative de connexion avec un encodage en Base64 et sans sécurité additionnel (MFA non supporté)
- La Basic Authentication ne va pas implémenter des mécanismes anti-bruteforce
- Nous n’avons pas forcément de processus de déconnexion avec la Basic Authentication du au stockage des identifiants, le password peut subir un délai lors d’une demande de reset.
D’accord. Et donc, concernant la Modern Authentication ?
Entre Outlook 2010 et 2013 un protocole va apparaitre avec les RFC 6749 et RFC 6750 : OAuth 2.0. Préparé depuis quelques années, ce protocole va permettre d’autoriser un site web à porter l’authentification de notre application. On va commencer à parler de délégation d’autorisation.

Le schéma est un peu imbuvable à première vu mais les choses à retenir sont principalement :
- L’application va rediriger l’utilisateur vers un provider d’identité qui va être Azure AD pour nous.
- On va s’identifier à Azure AD qui va nous donner un token. Celui-ci va pouvoir être validé par l’application et on sera authentifié.
On va pouvoir avoir du MFA ou encore du Microsoft Defender for Cloud Apps qui prend en charge différents modes de déploiement, y compris la collecte de journaux, les connecteurs API et du reverse proxy.
Oui mais Clément en quoi ça me concerne avec Office 365 ?
Au début, cela commence par un petit article : https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/deprecation-of-basic-authentication-exchange-online
Il dit simplement : Nous supprimons la possibilité d’utiliser l’authentification de base dans Exchange Online pour Exchange ActiveSync (EAS), POP, IMAP, PowerShell distant, services Web Exchange (EWS), carnet d’adresses en mode hors connexion (OAB), découverte automatique, Outlook pour Windows et Outlook pour Mac. Nous désactivons également l’authentification SMTP dans tous les tenant dans lesquels elle n’est pas utilisée.
Et du coup, j’ai un petit script PowerShell qui tournait toutes les semaines pour me sortir la volumétrie de mes boites mails. Ce bon vieux script que personne n’a actualisé depuis 5 ans commence généralement par ça :
$UserCredential = Get-Credential
Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/PowerShell-LiveID/ -Credential $o365cred -Authentication Basic -AllowRedirection
Import-PSSession $Session -DisableNameChecking
Il va aussi généralement terminé par ça :
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -From 'User01 <user01@fabrikam.com>' -To 'ITGroup <itdept@fabrikam.com>' -Cc 'User02 <user02@fabrikam.com>' -Bcc 'ITMgr <itmgr@fabrikam.com>' -Subject "Reporting Volumétrie BAL" -Body $body -Attachments $Attachements -Credential $mycreds -UseSsl
Et donc, avec la désactivation du PowerShell Distant je fais comment ? Parce qu’au final le script ne fonctionnera plus le 1er Janvier. On va voir ensemble comment se connecter en Modern Authentication afin de remettre notre reporting sur pied.
La première chose à faire c’est de télécharger les nouveaux modules PowerShell Exchange et Graph :
Install-Module -Name ExchangeOnlineManagement
Install-Module -Name Microsoft.Graph
Une fois cela fait, on va pouvoir commencer à travailler avec. Si vous avez un compte administrateur Exchange vous pouvez faire un Connect-ExchangeOnline et vous aurez la fenêtre d’authentification classique qui va vous permettre de rentrer vos credentials et de vous connecter. Celle-ci en plus supporte le MFA.
Mais du coup comment faire une app qui peut supporter le Connect-ExchangeOnline sans que j’aille à rentrer mes credentials à chaque fois ?
La méthode la plus simple se trouve être celle du certificat applicatif. Pour se faire on va commencer par créer une app qui va recevoir les connections de notre script afin de faire tourner le reporting.
https://aad.portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps
On va lui donner un nom et laisser seulement les comptes de cette organisation.
Une fois créée, on va prendre soin de noter l’Application ID, qui lui va nous servir dans notre script. On fera de même pour le Tenant ID
On va ensuite créer un certificat, soit avec une autorité, soit auto-signé, voir avec Azure directement. On l’upload dans notre application et on va garder le thumbprint de celui-ci. On prendra soin aussi d’installer le certificat sur notre machine de script.
Est-ce qu’on a fini ? Non, parce qu’accéder à une application qui n’a aucun droit n’est pas forcément utile. En allant dans la blade API Permissions, on va pouvoir donner des droits à notre app afin qu’elle puisse faire ce qu’elle a besoin, par exemple le droit Microsoft Graph Mail.send pour que notre rapport arrive bien dans notre boite mail.
On va souvent vous demander, droits délégués ou app permissions. Pour notre script c’est un important d’avoir de l’app permissions parce qu’on ne passe pas par des credentials mais par un certificat. Cela sera aussi le cas si vous utiliser un secret pour récupérer votre token.
Voici quelques articles qui vous serviront quand vous serviront quand vous aurez besoin de configurer des autorisations API pour de l’IMAP/POP ou de l’EWS :
On va aller chercher aussi les droits Exchange qu’on a besoin pour sortir les volumétries des mailboxes :
Une fois les API sélectionnées, pensez à Grant Admin Consent afin de valider les autorisations que vous donnez.
Ensuite, rendez-vous dans « Rôles et administrateurs » et sélectionner votre rôle Exchange Administrator
Ajoutez le droit à votre application et vous verrez qu’il apparaitra en tant que service principal dans les utilisateurs auxquels vous avez mis les droits.
Cet article pourra vous aider à affiner vos droits :
https://learn.microsoft.com/fr-fr/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps
Une fois cela fait. On va pouvoir construire notre commande PowerShell pour se connecter :
$CertificateThumbprint="XXX"$AppId=“XXX”
$TenantId="XXX"
$org = "contoso.onmicrosoft.com"
Connect-ExchangeOnline -AppId $AppId -Organization $org -CertificateThumbprint $CertificateThumbprint
Connect-MgGraph -AppId $AppId -TenantId $TenantId -CertificateThumbprint $CertificateThumbprint
Faites vos tests afin de valider que la connexion s’effectue bien.
Dans le principe, notre ancienne commande :
Send-MailMessage -SmtpServer smtp.office365.com -Port 587 -From 'User01 <user01@fabrikam.com>' -To 'ITGroup <itdept@fabrikam.com>' -Cc 'User02 <user02@fabrikam.com>' -Bcc 'ITMgr <itmgr@fabrikam.com>' -Subject "Reporting Volumétrie BAL" -Body $body -Attachments $Attachements -Credential $mycreds -UseSsl
Va venir être remplacé par celle-ci quand on va envoyer des mails :
Send-MgUserMail -UserId $userId -BodyParameter $params
Elle se construit de paramètres d’envoi de mail tel que : Headers, Subject, body, Attachement, to, cc. On aura aussi le UserID qui sera notre Sender.
On va voir ensemble comment la construire avec l’exemple de la volumétrie :
# ===================================================================================================# MAIN # ==================================================================================================
#prerequis
#Install-Module Microsoft.Graph
#Install-Module ExchangeOnlineManagement
write-Host "### START ###"
# ---------- Connecting to Exchange ----------
$CertificateThumbprint="XXX"
$AppId="XXX"
$TenantId="XXX"
$org="contoso.onmicrosoft.com"
Connect-ExchangeOnline -AppId $AppId -Organization $org -CertificateThumbprint $CertificateThumbprint
Connect-MgGraph -AppId $AppId -TenantId $TenantId -CertificateThumbprint $CertificateThumbprint
# ---------- Creation du CSV d'export ----------
$c_ScriptPath=try{Split-Path -Path $MyInvocation.MyCommand.Path -Parent}catch{$c_ScriptPath=Convert-Path (Get-Location -PSProvider FileSystem)}
$Outputfile = "$c_ScriptPath\MailboxVolume.csv"
Write-output "name;userprincipalname;size (MB)" | out-file $outputfile -encoding UTF8
# ---------- Get de toutes les boites et remplissage de l'export ----------
$users = get-mailbox -ResultSize:Unlimited | where {$_.recipienttypedetails -eq "UserMailbox"}
Foreach ($u in $users){
$name=$u.DisplayName
$userprincipalname=$u.userprincipalname
$tsize = get-mailboxstatistics -Identity $u.id
try {
$size= [math]::Round(($tsize.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)
} Catch {Continue}
Add-content -path $Outputfile -encoding UTF8 -value "$name;$userprincipalname;$size"
}
# ---------- Definition des variables du message ----------
# HTML header CSS styles
$htmlhead="<html>
<style>
BODY{font-family: Arial; font-size: 11pt;}
H1{font-size: 22px;}
H2{font-size: 18px; padding-top: 10px;}
H3{font-size: 16px; padding-top: 8px;}
</style>"
# Body
$HtmlBody = "<body>
<h1>Report de Volumetrie du $(Get-Date -Format MM-dd-yyyy) </h1>
<p><strong>Generated:</strong> $(Get-Date -Format g)</p>
</body>"
# Jointure du CSV en PJ
$AttachmentFile = Get-Content $Outputfile -Encoding Byte
$ContentBase64 = [convert]::ToBase64String($AttachmentFile)
# Mailbox qui envoie et destinataire
$Sender="service@contoso.com"
$Recipient="clement.serafin@contoso.com"
#Formatage
$params = @{
Message = @{
Subject = "Report de Volumetrie du $(Get-Date -Format MM-dd-yyyy)"
Body = @{
ContentType = "HTML"
Content = "$htmlMsg"
}
attachments = @( @{
"@odata.type" = "#microsoft.graph.fileAttachment"
"name" = $Outputfile
"contenttype" = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
"contentBytes" = $ContentBase64 } )
ToRecipients = @(
@{
EmailAddress = @{
Address = "$Recipient"
}
}
)
<# CcRecipients = @(
@{
EmailAddress = @{
Address = "$ccRecipient"
}
}
)#>
}
SaveToSentItems = "false"
}
# Ca part !
Send-MgUserMail -UserId $userId -BodyParameter $params
#Clean up session
Get-PSSession | Remove-PSSession
Merci pour votre Lecture

wow!! 40Le AllinPass K43 et la Fingerprint card de chez FEITIAN
J’aimeJ’aime