{"id":948,"date":"2025-03-03T19:33:27","date_gmt":"2025-03-03T18:33:27","guid":{"rendered":"https:\/\/sparrow365.de\/?p=948"},"modified":"2025-04-20T22:53:16","modified_gmt":"2025-04-20T20:53:16","slug":"custom-m365-terms-of-use-part-2-entra-apps","status":"publish","type":"post","link":"https:\/\/sparrow365.de\/index.php\/en\/2025\/03\/03\/custom-m365-terms-of-use-part-2-entra-apps\/","title":{"rendered":"Custom M365 Terms of Use Part 2: Entra Apps"},"content":{"rendered":"<p><a href=\"https:\/\/sparrow365.de\/index.php\/en\/2024\/12\/31\/custom-m365-terms-of-use-part-1-tenant-wide-settings\/\">In the last part<\/a>, we set the tenant-wide &quot;Terms of Use&quot; (ToU). In this part, we will look at solutions for applications connected to Entra. While Conditional Access ToU is often a good solution, even with the required Entra ID P1 license, you will quickly reach the limit of 40 possible ToUs if you define a separate policy for each application.<\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/users\/directory-service-limits-restrictions\"><img decoding=\"async\" style=\"max-height:100px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/03\/2_TenantLimitations.png\" alt=\"TenantLimitations\" ><\/a><\/p>\n<p>Or you also encountered the issues in non-persistent VDI environments and are looking for options.<\/p>\n<p>So let&#8217;s take a look at the options that are truly intended for individual applications.<\/p>\n<p><br class=\"\"><\/p>\n<h2>Enterprise Applications<\/h2>\n<div class=\"imageflex\" style=\"display: flex;\">\n    <img decoding=\"async\" src=\"https:\/\/learn.microsoft.com\/de-de\/entra\/identity-platform\/media\/application-consent-experience\/consent_prompt_1a.png\" height=\"400px\"> <\/p>\n<p class=\"imageflexcontent\" style=\"margin-left:5px; margin-top:0;\"> Enterprise applications are, simply put, the login interfaces of an application to Entra. If no adjustments have been made here, your users are most likely already allowing third-party applications to access company data under the Terms of Use set by the developers. <br class=\"\"> <br class=\"\"> This granting of access to data on one&#8217;s behalf is called <b>user consent<\/b>. <br class=\"\"> <br class=\"\"> The image on the left should be familiar\u2014it shows such a consent request. <br class=\"\"> <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity-platform\/application-consent-experience#app-requires-a-permission-that-the-user-has-the-right-to-grant\">Source: Microsoft<\/a> <\/p>\n<\/div>\n<p><br class=\"\"><\/p>\n<p>I will assume at this point that the tenant only allows user consent for its own applications or non-critical permissions.<\/p>\n<p><img decoding=\"async\" style=\"max-height:300px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/03\/0_ConsentAndPermissionSettings.webp\" alt=\"AdminCenterRestrictionOnUserConsent\" ><\/p>\n<blockquote>\n<p>\u26a0\ufe0f <em>Warning: While this setting is recommended, it is <a href=\"https:\/\/entra.microsoft.com\/#view\/Microsoft_AAD_IAM\/ConsentPoliciesMenuBlade\/~\/UserSettings\">unfortunately not the default!<\/a><\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<p>However, it is important that users are not entirely denied the ability to provide user consent. Otherwise, applications would only receive approval at the Tenant level from an administrator.<\/p>\n<p>We want to avoid that in this case \u2014 instead, <strong>the user<\/strong> should &quot;consciously&quot; give their consent.<\/p>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h3>Multi-Tenant Applications<\/h3>\n<p>A multi-tenant application allows other organizations to install an \u2018instance\u2019 in their tenant and apply their own user accounts, permissions, and Conditional Access policies.<\/p>\n<p>You can identify such an application in the Admin Center by looking at the App <strong>Registration<\/strong> and check whether the following button is set:<\/p>\n<p><img decoding=\"async\" style=\"max-height:150px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/03\/0_1_1_tenantChoice-e1741003974995.webp\" alt=\"AdminCenterAPI\"><\/p>\n<p>In such an app registration, you can and should define the Terms of Use (ToU) and Privacy Statement under &#8218;Branding &amp; Properties&#8216;. These will be displayed in the consent request and must be explicitly accepted by users.<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><img decoding=\"async\" style=\"max-height:300px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/03\/0_1_3_TemsOfUseSettings.webp\" alt=\"TermsOfUseInAdminCenter\" ><\/td>\n<td><img decoding=\"async\" style=\"max-height:400px;\" src=\"https:\/\/sparrow365.de\/wp-content\/uploads\/2025\/03\/0_1_ConsentRequest.png\" alt=\"EntraID Multi Tenant Application Consent Request\" ><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p>\u26a0\ufe0f <em>Warning: This only works for multi-tenant applications!<\/em> \u26a0\ufe0f<\/p>\n<\/blockquote>\n<p>I strongly <strong>advise against<\/strong> creating a multi-tenant application <em>solely<\/em> to set individual ToUs per application. In the past, successful attacks have exploited the cross-tenant <code>common<\/code> token endpoint, which would not have worked if the application only accepted tokens issued for its own environment.<\/p>\n<blockquote>\n<p><strong><a href=\"https:\/\/msrc.microsoft.com\/blog\/2023\/03\/guidance-on-potential-misconfiguration-of-authorization-of-multi-tenant-applications-that-use-azure-ad\/#guidance-on-securing-your-multi-tenant-applications-that-use-azure-ad\">Microsoft also recommends using single-tenant applications whenever possible.<\/a><\/strong><br \/>\nHere are some cases where multi-tenant applications have been vulnerable (and, as of March 2025, <strong>some still apply<\/strong>):<\/p>\n<ul>\n<li>2023: <a href=\"https:\/\/www.wiz.io\/blog\/azure-active-directory-bing-misconfiguration\">BingBang<\/a> &#8211; Users from any tenant could temporarily access Azure services when those were configured as multi-tenant.<\/li>\n<li>2023: <a href=\"https:\/\/msrc.microsoft.com\/blog\/2023\/06\/potential-risk-of-privilege-escalation-in-azure-ad-applications\/#customer-impact\">nOAuth<\/a> &#8211; Emails are not globally unique, yet many applications rely on them for authentication. This is a common OAuth misimplementation, where reducing logins to a single tenant significantly reduces the risk of exploitation.<\/li>\n<\/ul>\n<\/blockquote>\n<hr \/>\n<h3>Single-Tenant Applications<\/h3>\n<p>In single-tenant applications, the only option is to obtain consent for OAuth permissions. It is assumed, fairly, that well-known <strong>Terms of Use<\/strong> and <strong>Privacy<\/strong> policies already apply <strong>within<\/strong> the tenant.<\/p>\n<p>For a single-tenant application, the text in the consent request <strong>always<\/strong> appears as follows:<\/p>\n<blockquote>\n<p><em>Accepting these permissions means that you allow this app to use your data as specified in their terms of service and privacy statement. You can change these permissions at <a href=\"https:\/\/myapps.microsoft.com\">https:\/\/myapps.microsoft.com<\/a>.<br \/>\n<br class=\"\"><br \/>\nOnly accept if you trust the publisher and if you selected this app from a store or website you trust. Ask your admin if you&#8217;re not sure. Microsoft is not involved in licensing this app to you.<\/em><\/p>\n<\/blockquote>\n<hr \/>\n<h3>Advanced Consent Features and Further Information<\/h3>\n<p>This chapter was intentionally kept at a <strong>very high level<\/strong>, to focus primarily on the <strong>ToU<\/strong> aspect.  <\/p>\n<p>If you&#8217;re interested in diving deeper into <strong>Enterprise Apps<\/strong> and <strong>OAuth Grants<\/strong>, I recommend the following topics, listed in order of decreasing priority but increasing complexity:<\/p>\n<ol>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity-platform\/application-consent-experience\">The OAuth consent screen for users and what it entails<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/enterprise-apps\/protect-against-consent-phishing\">How OAuth consent can be exploited<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/enterprise-apps\/configure-user-consent?tabs=azure-portal&amp;pivots=portal#configure-user-consent-settings\">Restricting user consent<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/enterprise-apps\/configure-admin-consent-workflow\">Configuring the admin request process<\/a><\/li>\n<li><a href=\"https:\/\/www.pimwiddershoven.nl\/entry\/application-consent-policies-to-delegate-admin-consent\/\">Granular consent policies by Pim Widdershoven<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/enterprise-apps\/manage-app-consent-policies?pivots=ms-powershell\">Granular consent policies \u2014 detailed Microsoft documentation<\/a><\/li>\n<\/ol>\n<p><br class=\"\">  <\/p>\n<hr \/>\n<h2>CIAM Systems<\/h2>\n<p>This is more of an <strong>honorable mention<\/strong> \u2014 a last resort if everything else fails and a custom solution needs to be developed.<\/p>\n<p><strong>C<\/strong>ustomer or <strong>C<\/strong>onsumer <strong>I<\/strong>dentity and <strong>A<\/strong>ccess <strong>M<\/strong>anagement (CIAM) systems are <strong>highly simplified identity providers<\/strong> designed for <strong>very high user numbers<\/strong> and <strong>maximum flexibility<\/strong>. However, nearly all processes must be custom-developed or at least extensively adapted.<\/p>\n<p>When interacting with large numbers of external users, implementing such a system can be beneficial on multiple levels. It allows organizations to:<\/p>\n<ul>\n<li><strong>Reduce costs<\/strong> by saving on expensive full licenses,<\/li>\n<li>Retrieve <strong>extended or customized user information<\/strong>, and<\/li>\n<li>Establish a <strong>clear separation between external and internal users<\/strong>.<\/li>\n<\/ul>\n<p>However, the <strong>initial investment<\/strong> is significantly higher and <strong>cannot be handled by administrators alone<\/strong> \u2014 it requires professional developers.<\/p>\n<p>As of <strong>March 2025<\/strong>, Microsoft&#8217;s offering consists of <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/external-id\/external-identities-overview\"><strong>Entra External ID<\/strong><\/a>, which is still in its early stages, and its \u2018soft\u2019 deprecated predecessor, <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/active-directory-b2c\/overview\"><strong>Entra ID (formerly Azure AD) B2C<\/strong><\/a>.<\/p>\n<p><br class=\"\"><\/p>\n<hr \/>\n<h2>Summary<\/h2>\n<p>Our new options can be summarized as follows:<\/p>\n<table>\n<thead>\n<tr>\n<th>Setting<\/th>\n<th>Affected User Types<\/th>\n<th>Visibility<\/th>\n<th>Explicit Confirmation<\/th>\n<th>&quot;File Type&quot;<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>OAuth Consent<\/strong><\/td>\n<td>Internal users, guests<\/td>\n<td>First authentication to an application <b>*<\/b><\/td>\n<td>\u2705 Required <b>*<\/b><\/td>\n<td>Requested individual permissions (scopes)<\/td>\n<\/tr>\n<tr>\n<td><strong>Multi-Tenant Enterprise App<\/strong><\/td>\n<td>Internal users, guests<\/td>\n<td>First auth <b>*<\/b><\/td>\n<td>\u2705 Required <b>*<\/b><\/td>\n<td>URL<\/td>\n<\/tr>\n<tr>\n<td><strong>Single-Tenant Enterprise App<\/strong><\/td>\n<td>Internal users, guests<\/td>\n<td>First auth <b>*<\/b><\/td>\n<td>\u2705 Required <b>*<\/b><\/td>\n<td>Only OAuth permissions are visible!<\/td>\n<\/tr>\n<tr>\n<td><strong>CIAM System<\/strong><\/td>\n<td>Registered users<\/td>\n<td>During registration, login <b>**<\/b><\/td>\n<td>\u2705 Required <b>**<\/b><\/td>\n<td>Arbitrary <b>**<\/b><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p><b>*<\/b> <em>Assuming no Admin Consent was granted.<\/em><br \/>\n<b>**<\/b> <em>Depending on the design of the custom solution.<\/em><\/p>\n<\/blockquote>\n<p>I already mentioned this in <strong><a href=\"https:\/\/sparrow365.de\/index.php\/en\/2024\/12\/31\/custom-m365-terms-of-use-part-1-tenant-wide-settings\/\">Part 1<\/a><\/strong>, but it&#8217;s important to emphasize again:<br \/>\nIf an application <strong>does not require login<\/strong> (anonymous users), <strong>none<\/strong> of the configurations listed here will apply.<\/p>\n<p><br class=\"\"><\/p>\n<p>In the (planned) <strong>final part<\/strong> of this series, I will discuss options in <strong>Microsoft Teams<\/strong> and explore solutions in other <strong>M365 applications<\/strong>.<\/p>\n<p>If there\u2019s anything you know that I could include, or if there\u2019s a topic that particularly interests you, feel free to leave a comment or connect with me on LinkedIn! <\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last part, we set the tenant-wide &quot;Terms of Use&quot; (ToU). In this part, we will look at solutions for applications connected to Entra. While Conditional Access ToU is often a good solution, even with the required Entra ID P1 license, you will quickly reach the limit of 40 possible ToUs if you define&#8230; &raquo; <a class=\"read-more-link\" href=\"https:\/\/sparrow365.de\/index.php\/en\/2025\/03\/03\/custom-m365-terms-of-use-part-2-entra-apps\/\">weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":945,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[76,366],"tags":[80,84,165,426,258,88,90,363,453],"class_list":["post-948","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-me-id-en","category-m365","tag-aad-en","tag-azure-ad-en","tag-best-practices-en","tag-ciam","tag-enterprise-app","tag-entra-en","tag-entra-id-en","tag-microsoft-365-en","tag-tou-en"],"_links":{"self":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/comments?post=948"}],"version-history":[{"count":5,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/948\/revisions"}],"predecessor-version":[{"id":967,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/948\/revisions\/967"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media\/945"}],"wp:attachment":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media?parent=948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/categories?post=948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/tags?post=948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}