Hopefully, most of you have read the Microsoft announcements around disabling Basic authentication in Exchange Online over the last months. These announcements are the last steps of a more than three-year journey.
After a lot of preparation within Microsoft 365 and Exchange Online, including incorporating feedback from customers, Microsoft is going to disable Basic authentication for most Exchange Online protocols starting in October 2022. As this change has been announced and prepared for over a long period of time, there will be no exceptions to the disabling of Basic authentication. The product group stated this loud and clear in the following referenced blog post:
There is no way to request an exception after October. Tenant selection is random, and we cannot put your tenant to the back of the queue to give you more time or change your settings on any specific date.
This statement should give you ample motivation to plan for the elimination of Basic authentications in your environment.
As a general refresher and great single point of information, see Deprecation of Basic authentication in Exchange Online | Microsoft Docs. In addition, don´t forget to check the May 2022 blog post that has all the latest information and guidance: Basic Authentication Deprecation in Exchange Online – May 2022 Update - Microsoft Tech Community.
The change affects multiple clients and protocols that access Exchange Online mailboxes. Microsoft Outlook, the most used client in enterprise environments, has supported Modern authentication since the 2013 version. Therefore, if you haven´t yet moved to Modern Authentication with Outlook 2013, see Enable Modern authentication for Office 2013 on Windows devices - Microsoft 365 admin | Microsoft Docs for the registry key to enable Modern Auth support.
Later versions of Outlook already support Modern authentication by default. However, you might have disabled it using the previously mentioned registry for Office 2013. Now would be the time to turn Modern authentication back on.
Let´s move further to Exchange ActiveSync, which was also widely used with Basic authentication in the past. But all mobile phone vendors and app producers now include OAuth support in their native email clients. As mentioned in the referenced articles, you can use the Azure AD sign-in logs to find users/clients who are still using Basic authentication with the "Client app" filter. In this case, look for the “Client app” value "Exchange ActiveSync".
You might have thought that your environment isn´t using Basic authentication for Exchange ActiveSync, but the report gives you a long list of users. In this case, the report might have tricked you. Exchange Online has supported certificate-based authentication for ActiveSync for a long time now. This capability has been widely adopted, which also may be the case for you. So, the report lists users where Basic authentication is not used but certificate-based authentication is. Even though certificate-based authentication is considered strong authentication, the report still lists certificate-based authentication with Exchange ActiveSync as legacy authentication. You can see this information by opening the authentication details tab.
The Azure AD Sign-in report doesn´t allow you to filter ActiveSync using certificate-based authentication. So, let´s switch to the Azure AD Workbooks section, which allows you query using Log Analytics.
The Workbook named "Sign-Ins using Legacy Auth..." gives you a quick summary of the different protocols that are still using Basic authentication. But you also have the option to view the KQL query that’s used here by clicking the small button, "Open the last query in the Logs view."
This selection also allows you to write your own queries by simply opening a new query beside the given one. We filtered out the certificate-based authentication clients with the following query:
SigninLogs| project TimeGenerated,AuthenticationDetails,UserPrincipalName,ClientAppUsed| where TimeGenerated > ago(2d)| where ClientAppUsed == "Exchange ActiveSync"| mv-expand authValue=todynamic(AuthenticationDetails)| where authValue.authenticationMethod != "Certificate"| project-away AuthenticationDetails| summarize count() by UserPrincipalName
This example query should give you a good starting point to remove Exchange ActiveSync Basic Authentication dependencies.
Finally let´s talk about POP and IMAP access. Although SMTP AUTH is closely related, Microsoft is not yet disabling Basic authentication for SMTP AUTH, so we’ll focus only on POP and IMAP.
Microsoft has documented the requirements and configuration steps to use OAuth with POP/IMAP in Microsoft 365 in this article: Authenticate an IMAP, POP or SMTP connection using OAuth | Microsoft Docs. You’ll see details about the registration of the required Azure AD applications and the permissions required for the access token to give Exchange Online the authorization of the mailbox access request.
As time is ticking, I'm getting more requests from admins that they need to enable OAuth support for different POP/IMAP applications that are used in their environment, which they can configure by creating an Azure AD application as described in the previously mentioned article.
Their primary question is how to test their implementation before sharing further information with their business. While testing it with Basic Authentication and using OpenSSL Clients (like this one for Windows which you can download here: Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com) or check other sources here: Binaries - OpenSSLWiki) was easy and straight forward, authenticating with the needed SASL XOAuth2 string is more cumbersome.
To help, I created this Powershell script: https://github.com/DanijelkMSFT/ThisandThat/blob/main/Get-IMAPAccessToken.ps1, which uses the MSAL.PS library (discussed here: (1) Not using msal.ps in your scripts, yet? | LinkedIn ) to provide a managed interactive OAuth authentication flow. The script also includes a token cache in Windows Powershell to safely store the access token and refresh token after successful authentication. It´s important to use scope "https://outlook.office365.com/.default" for POP/IMAP access. You need to install the MSAL.PS powershell module as a prerequisite for the script (latest version would be PowerShell Gallery | MSAL.PS 220.127.116.11).
Using the received access token and based on the referenced documentation how to generate the SASL XOAUTH2 login string,
the script builds the needed XOAuth2 login string,
opens a TLS1.2 connection to the IMAP service in Exchange Online and tries to authenticate using the SASL XOAUTH2 encoded string. If this action is successful, it executes a simple IMAP folder listing and logs off again. It’s even enough to see that authentication and access using IMAP with OAuth based login on the newly registered Azure AD application. If everything works, you’ll get a folder listing using IMAP after OAuth authentication that looks like this.
You might have noticed that the script also allows you to provide the email address of a shared mailbox. This optional parameter allows you to check OAuth access to shared mailboxes, a use case I see very often within my enterprise customers.
The popular IMAP app Thunderbird provides integrated OAuth support for Exchange Online mailbox access. In this case, admins don´t need to register their own apps. Instead, the Mozilla foundation pre-created a multi-tenant Azure application with a unique ClientID/ApplicationID. This capability is incorporated into the Thunderbird client and can be found here: https://hg.mozilla.org/comm-central/raw-file/tip/mailnews/base/src/OAuth2Providers.jsm
This capability simplifies the registration process by allowing admins to simply add this application to their tenant grant consent without the need for additional information. Adding the application is very well explained and documented here: Configuring Exchange Online with IMAP & OAuth2 | EighTwOne (821)
That´s it. Thanks for taking the time to read this information. Hopefully, it will help you to adopt OAuth for POP/IMAP more easily.
Big thanks to Greg Taylor, Chris Davis and Karl Coelho for their help with insides and reviews all the way long ❤️
Not to forget Michel de Rooij for his great writeup about the thunderbird integration 👍
Quick addition, as hot of the press...
Some hours ago, Microsoft announced the availability of the client credential flow which can be used with application permission for e.g. daemon scenarios. Please know a new exchange cmdlet is needed to configure this, which is still being rollout out. Therefore, you might not be able to test it directly but for sure soon. Announcing OAuth 2.0 Client Credentials Flow support for POP and IMAP protocols in Exchange Online - Microsoft Tech Community
I will update my referenced script to also provide you this option as soon as EXO is giving me access to the needed cmdlet 😎
Update as the needed EXO cmdlet is available now:
As the needed Exchange cmdlet changes have been rolled out now, I worked myself through the updated documentation here Authenticate an IMAP, POP or SMTP connection using OAuth | Microsoft Docs and registered the application permission in a new Azure AD App.
Furthermore, as described in the documentation the service principal which has been created during Azure AD Application creation, needs to be created/mirrored to Exchange Online. Where the new Cmdlet “New-ServicePrincipal” comes into play.
We need details from the registered Azure AD App, so I am using the Get-AzureADServicePrincipal cmdlet out of the Azure AD Powershell Module, which will return us all needed information to use the new EXO cmdlet with the right values.
# first get the principal informations of the registered app$ServicePrincipalDetails = Get-AzureADServicePrincipal -SearchString YourAppName#next create a new (referenced) service principal in Exchange OnlineNew-ServicePrincipal -AppId $ServicePrincipalDetails.AppId -ServiceId $ServicePrincipalDetails.ObjectId -DisplayName "EXO Serviceprincipal for AzureAD App $($ServicePrincipalDetails.Displayname)"
From now on, the new ServicePrincipal can be used within Exchange Online to apply permission to access mailboxes. Using the Identity/ServiceID of the newly created EXO ServicePrincipal. Now grant access to the mailbox the app should be able to access, and you are DONE!
Finally, I extended my referenced script to support the Client Credential flow using a client secret or certificate authentication. If you would like to use a certification to authenticate as your registered app, check out the example here App-only authentication | Microsoft Docs to create an appropriate certificate to be used with the AzureAD App.
Happy Testing 👍👍👍