Sichern von Java Tomcat-Apps mithilfe von Gruppen und Gruppenansprüchen
In diesem Artikel erfahren Sie, wie Sie eine Java Tomcat-App erstellen, die Benutzer mit Microsoft Authentication Library (MSAL) für Java anmeldet. Die App beschränkt auch den Zugriff auf Seiten basierend auf der Sicherheitsgruppenmitgliedschaft von Microsoft Entra ID.
In der folgenden Abbildung wird die Topologie für diese App veranschaulicht:
Die Client-App verwendet MSAL für Java (MSAL4J), um Benutzer bei einem Microsoft Entra ID-Mandanten anzumelden und ein ID-Token von Microsoft Entra ID abzurufen. Das ID-Token beweist, dass ein Benutzer bei diesem Mandanten authentifiziert wird. Die App schützt ihre Routen entsprechend dem Authentifizierungsstatus und der Gruppenmitgliedschaft des Benutzers.
Ein Video, das dieses Szenario behandelt, finden Sie unter Implementieren der Autorisierung in Ihren Anwendungen mithilfe von App-Rollen, Sicherheitsgruppen, Bereichen und Verzeichnisrollen.
Voraussetzungen
- JDK Version 8 oder höher
- Maven 3
- Microsoft Entra ID-Mandant. Weitere Informationen finden Sie unter So erhalten Sie einen Microsoft Entra ID-Mandanten.
- Ein Benutzerkonto in Ihrem eigenen Microsoft Entra ID-Mandanten.
- Zwei Sicherheitsgruppen,
GroupAdmin
undGroupMember
, die Benutzer enthalten, mit denen Sie testen möchten.
Empfehlungen
- Vertrautheit mit den Java / Jakarta Servlets.
- Vertrautheit mit Linux/OSX-Terminal.
- jwt.ms zum Überprüfen Ihrer Token.
- Fiddler zur Überwachung Ihrer Netzwerkaktivität und Problembehandlung.
- Lesen Sie den Microsoft Entra ID-Blog, um mit den neuesten Entwicklungen auf dem neuesten Stand zu bleiben.
Einrichten des Beispiels
Die folgenden Abschnitte zeigen Ihnen, wie der Beispielcode für die Anwendung eingerichtet wird.
Klonen oder Herunterladen des Beispielrepositorys
Um das Beispiel zu klonen, öffnen Sie ein Bash-Fenster, und verwenden Sie den folgenden Befehl:
git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/3-Authorization-II/groups
Wechseln Sie alternativ zum Repository ms-identity-msal-java-samples, laden Sie es dann als .zip-Datei herunter, und extrahieren Sie diese auf Ihre Festplatte.
Wichtig
Um Längenbeschränkungen für Dateipfade unter Windows zu vermeiden, klonen oder extrahieren Sie das Repository in ein Verzeichnis in der Nähe des Stamms Ihrer Festplatte.
Registrieren der Beispielanwendung bei Ihrem Microsoft Entra ID-Mandanten
Dieses Beispiel enthält ein einzelnes Projekt. In den folgenden Abschnitten wird gezeigt, wie Sie die App mithilfe des Azure-Portals registrieren.
Auswählen des Microsoft Entra ID-Mandanten, in dem Sie Ihre Anwendungen erstellen möchten
Verwenden Sie die folgenden Schritte, um den Mandanten auszuwählen:
Melden Sie sich beim Azure-Portal an.
Gehen Sie wie folgt vor, wenn Ihr Konto in mehr als einem Microsoft Entra ID-Mandanten vorhanden ist: Wählen Sie Ihr Profil in der Ecke des Azure-Portals und anschließend die Option Verzeichnis wechseln aus, um für Ihre Portalsitzung zum gewünschten Microsoft Entra ID-Mandanten zu wechseln.
Registrieren der App (java-servlet-webapp-groups)
Registrieren Sie zunächst eine neue App im Azure-Portal, indem Sie die Anweisungen unter Schnellstart: Registrieren einer Anwendung bei Microsoft Identity Platform befolgen.
Führen Sie anschließend die folgenden Schritte zum Abschließen der Registrierung aus:
Navigieren Sie zur Seite App-Registrierungen von Microsoft Identity Platform für Entwickler.
Wählen Sie Neue Registrierung aus.
Geben Sie auf der daraufhin angezeigten Seite Anwendung registrieren die folgenden Registrierungsinformationen Ihrer App ein:
- Geben Sie im Abschnitt Name einen aussagekräftigen Anwendungsnamen ein, der den Benutzern der App angezeigt wird (beispielsweise
java-servlet-webapp-groups
). - Wählen Sie unter Unterstützte Kontotypen die Option Nur Konten in diesem Organisationsverzeichnis aus.
- Wählen Sie im Abschnitt Umleitungs-URI (optional) im Kombinationsfeld die Option Web aus, und geben Sie die folgenden Umleitungs-URIs ein:
http://localhost:8080/msal4j-servlet-groups/auth/redirect
- Geben Sie im Abschnitt Name einen aussagekräftigen Anwendungsnamen ein, der den Benutzern der App angezeigt wird (beispielsweise
Wählen Sie Registrieren aus, um die Anwendung zu erstellen.
Suchen Sie auf der Registrierungsseite der App den Wert Anwendungsclient-ID, und notieren Sie ihn zur späteren Verwendung. Sie verwenden diesen Wert in den Konfigurationsdateien Ihrer App.
Wählen Sie Speichern aus, um Ihre Änderungen zu speichern.
Wählen Sie auf der Registrierungsseite der App Zertifikate & Geheimnisse aus, um die Seite zu öffnen, in dem Sie Geheimnisse generieren und Zertifikate hochladen können.
Wählen Sie im Abschnitt Geheime Clientschlüssel die Option Neuer geheimer Clientschlüssel aus.
Geben Sie eine Beschreibung ein (z. B. App-Geheimnis).
Wählen Sie eine der verfügbaren Laufzeiten aus: In 1 Jahr, In 2 Jahren oder Läuft nie ab.
Wählen Sie Hinzufügen. Der generierte Wert wird angezeigt.
Kopieren und speichern Sie den generierten Wert zur Verwendung in späteren Schritten. Sie benötigen diesen Wert für die Konfigurationsdateien des Codes. Dieser Schlüsselwert wird nicht erneut angezeigt, und Sie können ihn auch nicht auf andere Weise abrufen. Achten Sie daher darauf, ihn aus dem Azure-Portal zu speichern, bevor Sie zu einem anderen Bildschirm oder Bereich navigieren.
Wählen Sie auf der Registrierungsseite der App API-Berechtigungen im Navigationsbereich aus, um die Seite zu öffnen, auf der Sie Zugriff auf die von Ihrer Anwendung benötigten APIs hinzufügen können.
Wählen Sie Berechtigung hinzufügen aus.
Stellen Sie sicher, dass die Registerkarte Microsoft-APIs ausgewählt ist.
Wählen Sie im Abschnitt Häufig verwendete Microsoft-APIs die Option Microsoft Graph aus.
Wählen Sie im Abschnitt Delegierte Berechtigungen die Optionen User.Read und GroupMember.Read.All aus. Verwenden Sie bei Bedarf das Suchfeld.
Wählen Sie Berechtigungen hinzufügen aus.
GroupMember.Read.All
erfordert die Zustimmung des Administrators, wählen Sie also Administratoreinwilligung für {Mandant} erteilen/widerrufen und dann Ja aus, wenn Sie gefragt werden, ob Sie die Zustimmung für die angeforderten Berechtigungen für alle Konten im Mandanten erteilen möchten. Sie müssen ein Microsoft Entra ID-Mandantenadministrator sein, um diese Aktion auszuführen.
Konfigurieren der App (java-servlet-webapp-groups) für die Verwendung Ihrer App-Registrierung
Führen Sie die folgenden Schritte aus, um die App zu konfigurieren:
Hinweis
In den folgenden Schritten ist ClientID
identisch mit Application ID
oder AppId
.
Öffnen Sie das Projekt in Ihrem IDE.
Öffnen Sie die Datei ./src/main/resources/authentication.properties.
Suchen Sie die Zeichenfolge
{enter-your-tenant-id-here}
. Ersetzen Sie den vorhandenen Wert durch Ihre Microsoft Entra Mandanten-ID, wenn Sie Ihre App mit der Option Konten nur in diesem Organisationsverzeichnis registriert haben.Suchen Sie die Zeichenfolge
{enter-your-client-id-here}
, und ersetzen Sie den vorhandenen Wert durch die Anwendungs-IDclientId
derjava-servlet-webapp-groups
-Anwendung, die Sie aus dem Azure-Portal kopiert haben.Suchen Sie die Zeichenfolge
{enter-your-client-secret-here}
, und ersetzen Sie den vorhandenen Wert durch den Wert, den Sie beim Erstellen derjava-servlet-webapp-groups
-App im Azure-Portal gespeichert haben.
Sicherheitsgruppen konfigurieren
Sie haben die folgenden Optionen, wie Sie Ihre Anwendungen weiter konfigurieren können, um den Gruppenanspruch zu erhalten:
Erhalten Sie alle Gruppen, denen der angemeldete Benutzer in einem Microsoft Entra ID-Mandanten zugewiesen ist, einschließlich geschachtelter Gruppen. Weitere Informationen finden Sie im Abschnitt Konfigurieren der Anwendung für den Empfang aller Gruppen, denen der angemeldete Benutzer zugewiesen ist, einschließlich geschachtelter Gruppen.
Erhalten Sie die Gruppenanspruchswerte aus einer gefilterten Gruppe von Gruppen, mit denen Ihre Anwendung programmiert ist, damit sie funktioniert. Weitere Informationen finden Sie im Abschnitt Konfigurieren der Anwendung für den Empfang der Gruppenanspruchswerte aus einem gefilterten Satz von Gruppen, denen ein Benutzer möglicherweise zugewiesen ist. Diese Option ist in der Microsoft Entra ID Free Edition nicht verfügbar.
Hinweis
Informationen zum Abrufen von samAccountName
oder On Premises Group Security Identifier
der anstelle der Gruppen-ID finden Sie im Abschnitt Voraussetzungen für die Verwendung von Gruppenattributen, die aus Active Directory synchronisiert werden in Konfigurieren von Gruppenansprüchen für Anwendungen mithilfe der Microsoft Entra-ID.
Konfigurieren der Anwendung für den Empfang aller Gruppen, denen der angemeldete Benutzer zugewiesen ist, einschließlich geschachtelter Gruppen
Führen Sie zum Konfigurieren der Anwendung die folgenden Schritte aus:
Wählen Sie auf der Registrierungsseite der App im Navigationsbereich Tokenkonfiguration aus, um die Seite zu öffnen, auf der Sie die für Ihre Anwendung ausgestellten Ansprüche konfigurieren können.
Wählen Sie Gruppenanspruch hinzufügen aus, um den Bildschirm Gruppenanspruch bearbeiten zu öffnen.
Wählen Sie Sicherheitsgruppen ODER Alle Gruppen (einschließlich Verteilungslisten, jedoch nicht der der Anwendung zugewiesenen Gruppen) aus. Wenn Sie beide Optionen auswählen, wird die Auswirkung der Option Sicherheitsgruppen aufgehoben.
Wählen Sie im Abschnitt ID die Option Gruppen-ID aus. Diese Auswahl bewirkt, dass die Microsoft Entra-ID die Objekt-ID der Gruppen sendet, denen der Benutzer in den Gruppenansprüchen des ID-Tokens zugewiesen ist, das Ihre App nach der Anmeldung eines Benutzers erhält.
Konfigurieren Sie Ihre Anwendung so, dass sie die Gruppenanspruchswerte aus einer gefilterten Gruppe von Gruppen empfängt, denen ein Benutzer möglicherweise zugewiesen ist.
Diese Option ist nützlich, wenn die folgenden Fälle zutreffen:
- Ihre Anwendung ist an einer ausgewählten Gruppe von Gruppen interessiert, denen ein Anmeldebenutzer möglicherweise zugewiesen wird.
- Ihre Anwendung ist nicht an jeder Sicherheitsgruppe interessiert, der dieser Benutzer im Mandanten zugewiesen ist.
Diese Option hilft Ihrer Anwendung, das Überlastungsproblem zu vermeiden.
Hinweis
Diese Funktion ist in der Microsoft Entra ID Free Edition nicht verfügbar.
Geschachtelte Gruppenzuweisungen sind nicht verfügbar, wenn Sie diese Option verwenden.
Befolgen Sie die folgenden Schritte, um diese Option in Ihrer App zu aktivieren:
Wählen Sie auf der Registrierungsseite der App im Navigationsbereich Tokenkonfiguration aus, um die Seite zu öffnen, auf der Sie die für Ihre Anwendung ausgestellten Ansprüche konfigurieren können.
Wählen Sie Gruppenanspruch hinzufügen aus, um den Bildschirm Gruppenanspruch bearbeiten zu öffnen.
Wählen Sie Der Anwendung zugewiesene Gruppen aus.
Wenn Sie andere Optionen auswählen, beispielsweise Sicherheitsgruppen oder Alle Gruppen (einschließlich Verteilerlisten, aber nicht Gruppen, die der Anwendung zugewiesen sind),, Vorteile, die Ihre App aus der Wahl dieser Option zieht, verworfen.
Wählen Sie im Abschnitt ID die Option Gruppen-ID aus. Diese Auswahl führt dazu, dass die Microsoft Entra-ID die Objekt-ID der Gruppen sendet, denen der Benutzer im Gruppenanspruch des ID-Tokens zugewiesen ist.
Wenn Sie eine Web-API mithilfe der Option API verfügbar machen verfügbar machen, können Sie auch die Option Gruppen-ID im Abschnitt Zugriff auswählen. Diese Auswahl führt dazu, dass die Microsoft Entra-ID die Objekt-ID der Gruppen sendet, denen der Benutzer im Gruppenanspruch des Zugriffstokens zugewiesen ist.
Wählen Sie auf der Registrierungsseite der App im Navigationsbereich die Option Übersicht aus, um den App-Übersichtsbildschirm zu öffnen.
Wählen Sie unter Verwaltete Anwendung in lokalem Verzeichnis den Hyperlink mit dem Namen Ihrer App aus. Dieser Feldtitel kann abgeschnitten sein, beispielsweise
Managed application in ...
. Wenn Sie diesen Link auswählen, navigieren Sie zur Seite Übersicht über die Unternehmensanwendung, die dem Dienstprinzipal für Ihre Anwendung in dem Mandanten zugeordnet ist, in dem Sie sie erstellt haben. Über die Schaltfläche „Zurück“ in Ihrem Browser können Sie wieder zur App-Registrierungsseite navigieren.Wählen Sie im Navigationsbereich Benutzer und Gruppen aus, um die Seite zu öffnen, auf der Sie Ihrer Anwendung Benutzer und Gruppen zuweisen können.
Wählen Sie Benutzer hinzufügen.
Wählen Sie auf dem daraufhin angezeigten Bildschirm Benutzer und Gruppen aus.
Wählen Sie die Gruppen aus, die Sie dieser Anwendung zuweisen möchten.
Klicken Sie auf Auswählen, um die Auswahl der Gruppen abzuschließen.
Wählen Sie Zuweisen aus, um den Gruppenzuweisungsprozess abzuschließen.
Ihre Anwendung empfängt jetzt diese ausgewählten Gruppen in den Gruppenansprüchen, wenn ein Benutzer, der sich bei Ihrer App anmeldet, Mitglied einer oder mehrerer dieser zugewiesenen Gruppen ist.
Wählen Sie im Navigationsbereich Eigenschaften aus, um die Seite zu öffnen, auf der die grundlegenden Eigenschaften Ihrer Anwendung aufgelistet sind. Legen Sie das Falg Benutzerzuweisung erforderlich? auf Ja fest.
Wichtig
Wenn Sie Benutzerzuweisung erforderlich? auf Ja festlegen, überprüft Microsoft Entra ID, dass nur die Ihrer Anwendung zugewiesenen Benutzer im Bereich Benutzer und Gruppen sich bei Ihrer App anmelden können. Sie können Benutzer direkt oder durch Zuweisen von Sicherheitsgruppen zuweisen, denen sie angehören, zuweisen.
Konfigurieren der App (java-servlet-webapp-groups) zum Erkennen von Gruppen-IDs
Führen Sie die folgenden Schritte aus, um die App zu konfigurieren:
Wichtig
Wenn Sie auf der Seite Tokenkonfiguration eine andere Option als groupID (z. B. DNSDomain\sAMAccountName) ausgewählt haben, sollten Sie den Gruppennamen in den folgenden Schritten eingeben, Beispiel: contoso.com\Test Group
anstelle der Objekt-ID:
Öffnen Sie die Datei ./src/main/resources/authentication.properties.
Suchen Sie die Zeichenfolge
{enter-your-admins-group-id-here}
, und ersetzen Sie den vorhandenen Wert durch die Objekt-ID derGroupAdmin
-Gruppe, die Sie aus dem Azure-Portal kopiert haben. Entfernen Sie auch die geschweiften Klammern aus dem Platzhalterwert.Suchen Sie die Zeichenfolge
{enter-your-users-group-id-here}
, und ersetzen Sie den vorhandenen Wert durch die Objekt-ID derGroupMember
-Gruppe, die Sie aus dem Azure-Portal kopiert haben. Entfernen Sie auch die geschweiften Klammern aus dem Platzhalterwert.
Erstellen des Beispiels
Um das Beispiel mit Maven zu erstellen, navigieren Sie zu dem Verzeichnis, das die pom.xml-Datei für das Beispiel enthält, und führen Sie dann den folgenden Befehl aus:
mvn clean package
Dieser Befehl generiert eine .war-Datei, die Sie auf verschiedenen Anwendungsservern ausführen können.
Ausführen des Beispiels
In den folgenden Abschnitten wird veranschaulicht, wie Sie das Beispiel in Azure App Service bereitstellen.
Voraussetzungen
Maven-Plug-In für Azure App Service-Apps
Wenn Maven nicht Ihr bevorzugtes Entwicklungstool ist, lesen Sie die folgenden ähnlichen Lernprogramme, die andere Tools verwenden:
Konfigurieren des Maven-Plug-Ins
Bei der Bereitstellung für Azure App Service werden automatisch Ihre Azure-Anmeldeinformationen aus der Azure CLI verwendet. Wenn die Azure CLI nicht lokal installiert ist, führt das Maven-Plug-In die Authentifizierung über OAuth oder die Geräteanmeldung durch. Weitere Informationen finden Sie unter Authentifizierung mit Maven-Plug-Ins.
Gehen Sie wie folgt vor, um das Plug-In zu konfigurieren:
Führen Sie folgenden Befehl aus, um die Bereitstellung zu konfigurieren. Dieser Befehl unterstützt Sie beim Einrichten des Azure App Service-Betriebssystems, der Java-Version und der Tomcat-Version.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Drücken Sie für Neue Ausführungskonfiguration erstellen die Taste Y und dann die Eingabetaste.
Drücken Sie für Wert für Betriebssystem die Taste 1 für Windows oder 2 für Linux und dann die Eingabetaste.
Drücken Sie für Wert für javaVersion definieren die Taste 2 für Java 11 und dann die Eingabetaste.
Drücken Sie für Wert definieren für webContainer die Taste 4 für Tomcat 9.0 und dann die Eingabetaste.
Drücken Sie für Wert definieren für pricingTier die Eingabetaste, um die P1v2-Standardschicht auszuwählen.
Drücken Sie zum Bestätigen die Taste Y und dann die Eingabetaste.
Das folgende Beispiel zeigt die Ausgabe des Bereitstellungsprozesses:
Please confirm webapp properties
AppName : msal4j-servlet-auth-1707209552268
ResourceGroup : msal4j-servlet-auth-1707209552268-rg
Region : centralus
PricingTier : P1v2
OS : Linux
Java Version: Java 11
Web server stack: Tomcat 9.0
Deploy to slot : false
Confirm (Y/N) [Y]: [INFO] Saving configuration to pom.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37.112 s
[INFO] Finished at: 2024-02-06T08:53:02Z
[INFO] ------------------------------------------------------------------------
Nachdem Sie Ihre Auswahl bestätigt haben, fügt das Plug-in das erforderliche Plug-in-Element und die Einstellungen in der pom.xml-Datei Ihres Projekts hinzu, um Ihre App zur Ausführung in Azure App Service zu konfigurieren.
Der relevante Teil der pom.xml-Datei sollte ähnlich wie im folgenden Beispiel aussehen.
<build>
<plugins>
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>>azure-webapp-maven-plugin</artifactId>
<version>x.xx.x</version>
<configuration>
<schemaVersion>v2</schemaVersion>
<resourceGroup>your-resourcegroup-name</resourceGroup>
<appName>your-app-name</appName>
...
</configuration>
</plugin>
</plugins>
</build>
Sie können die Konfigurationen für App Service direkt in der Datei pom.xml ändern. Einige gängige Konfigurationen sind in der folgenden Tabelle aufgeführt:
Eigenschaft | Erforderlich | Beschreibung |
---|---|---|
subscriptionId |
false | Die Abonnement-ID. |
resourceGroup |
true | Die Azure-Ressourcengruppe für Ihre App. |
appName |
true | Der Name Ihrer App. |
region |
false | Die Region, in der Ihre App gehostet werden soll. Der Standardwert ist centralus . Gültige Regionen finden Sie unter Unterstützte Regionen. |
pricingTier |
false | Der Tarif für Ihre App. Der Standardwert ist P1v2 für eine Produktionsworkload. Der empfohlene Mindestwert für die Java-Entwicklung und -Tests ist B2 . Weitere Informationen finden Sie unter App Service – Preise. |
runtime |
false | Die Laufzeitumgebungskonfiguration. Weitere Informationen finden Sie unter Konfigurationsdetails. |
deployment |
false | Die Bereitstellungskonfiguration. Weitere Informationen finden Sie unter Konfigurationsdetails. |
Eine vollständige Liste der Konfigurationen finden Sie in der Dokumentation zur Plug-In-Referenz. Alle Azure Maven-Plug-ins verwenden einen gemeinsamen Satz von Konfigurationen. Diese Konfigurationen finden Sie unter Allgemeine Konfigurationen. Azure App Service-spezifische Konfigurationen finden Sie unter Azure-App: Konfigurationsdetails.
Denken Sie daran, die Werte für appName
und resourceGroup
zur späteren Verwendung zu speichern.
Vorbereiten der App zur Bereitstellung
Wenn Sie Ihre Anwendung in App Service bereitstellen, ändert sich ihre Umleitungs-URL in die Umleitungs-URL Ihrer bereitgestellten App-Instanz. Führen Sie die folgenden Schritte aus, um diese Einstellungen in der Eigenschaftsdatei zu ändern:
Navigieren Sie zur Datei authentication.properties, und ändern Sie den Wert
app.homePage
des Domänennamens Ihrer bereitgestellten App hinzu, wie im folgenden Beispiel gezeigt. Wenn Sie beispielsweiseexample-domain
als den App-Namen ausgewählt haben, müssen Sie jetzthttps://example-domain.azurewebsites.net
für den Wertapp.homePage
verwenden. Stellen Sie sicher, dass Sie das Protokoll auch vonhttp
inhttps
geändert haben.# app.homePage is by default set to dev server address and app context path on the server # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net app.homePage=https://<your-app-name>.azurewebsites.net
Verwenden Sie nach dem Speichern dieser Datei den folgenden Befehl, um Ihre App neu zu erstellen:
mvn clean package
Wichtig
In derselben Datei authentication.properties haben Sie eine Einstellung für aad.secret
. Es empfiehlt sich nicht, diesen Wert für App Service bereitzustellen. Ebenso wenig ist es eine bewährte Methode, diesen Wert in Ihrem Code zu belassen und ihn möglicherweise an Ihr Git-Repository zu übertragen. Wenn Sie diesen geheimen Wert aus Ihrem Code entfernen möchten, finden Sie ausführlichere Anleitungen im Abschnitt Bereitstellen in App Service – Geheimwert entfernen ". Diese Anleitung fügt zusätzliche Schritte zum Pushen des geheimen Werts an Key Vault und zum Verwenden von Key Vault-Verweisen hinzu.
Aktualisieren Sie die Registrierung Ihrer Microsoft Entra ID-App.
Da sich der Umleitungs-URI in Ihrer bereitgestellten App in Azure App Service ändert, müssen Sie auch den Umleitungs-URI in Ihrer Microsoft Entra ID-App-Registrierung ändern. Durchlaufen Sie folgende Schritte, um diese Änderung wirksam zu machen:
Navigieren Sie zur Seite App-Registrierungen von Microsoft Identity Platform für Entwickler.
Verwenden Sie das Suchfeld, um nach Ihrer App-Registrierung zu suchen. Beispiel:
java-servlet-webapp-authentication
.Öffnen Sie die App-Registrierung, indem Sie den Namen auswählen.
Wählen Sie im oberen Menü Authentifizierung aus.
Wählen Sie unter Web - Umleitungs-URIs die Option URI hinzufügen aus.
Füllen Sie den URI Ihrer App aus, indem Sie
/auth/redirect
anfügen. Beispiel:https://<your-app-name>.azurewebsites.net/auth/redirect
.Wählen Sie Speichern.
Bereitstellen der App
Sie können Ihre App jetzt in Azure App Service bereitstellen. Verwenden Sie den folgenden Befehl, um sicherzustellen, dass Sie bei Ihrer Azure-Umgebung angemeldet sind, um die Bereitstellung auszuführen:
az login
Wenn alle Konfigurationseinstellungen in Ihrer pom.xml-Datei eingerichtet sind, können Sie Ihre Java-App mit einem einzigen Befehl in Azure bereitstellen:
mvn package azure-webapp:deploy
Nach Abschluss der Bereitstellung steht Ihre Anwendung unter http://<your-app-name>.azurewebsites.net/
bereit. Öffnen Sie die URL mit Ihrem lokalen Webbrowser, in dem die Startseite der msal4j-servlet-auth
-Anwendung angezeigt werden soll.
Untersuchen des Beispiels
Gehen Sie folgendermaßen vor, um das Beispiel zu erkunden:
- Beachten Sie den angemeldeten oder abgemeldeten Status, der in der Mitte des Bildschirms angezeigt wird.
- Wählen Sie in der Ecke die Schaltfläche „Kontextsensitiv“ aus. Diese Schaltfläche lautet Anmelden, wenn Sie die App zum ersten Mal ausführen.
- Folgen Sie auf der nächsten Seite den Anweisungen, und melden Sie sich mit einem Konto im Microsoft Entra ID-Mandanten an.
- Beachten Sie auf dem Einwilligungsbildschirm die angeforderten Bereiche.
- Beachten Sie, dass die kontextsensitive Schaltfläche jetzt Abmelden lautet und Ihren Benutzernamen anzeigt.
- Klicken Sie auf ID-Tokendetails, um die decodierten Ansprüche des ID-Tokens anzuzeigen.
- Wählen Sie Gruppen aus, um alle Informationen zur Sicherheitsgruppenmitgliedschaft für den angemeldeten Benutzer anzuzeigen.
- Wählen Sie Nur Administrator oder Regulärer Benutzer aus, um auf die gruppengeschützten Endpunkte zuzugreifen.
- Wenn sich ihr angemeldeter Benutzer in der
GroupAdmin
-Gruppe befindet, kann der Benutzer beide Seiten eingeben. - Wenn sich Ihr angemeldeter Benutzer in der
GroupMember
-Gruppe befindet, kann der Benutzer nur die Seite Regulärer Benutzer eingeben. - Wenn sich Ihr angemeldeter Benutzer in keiner Gruppe befindet, kann der Benutzer nicht auf eine der beiden Seiten zugreifen.
- Wenn sich ihr angemeldeter Benutzer in der
- Verwenden Sie die Schaltfläche in der Ecke, um sich abzumelden.
- Nachdem Sie sich abgemeldet haben, wählen Sie ID-Tokendetails aus, um zu beobachten, dass die App einen
401: unauthorized
-Fehler anstelle der ID-Tokenansprüche anzeigt, wenn der Benutzer nicht autorisiert ist.
Informationen zum Code
In diesem Beispiel wird MSAL für Java (MSAL4J) verwendet, um einen Benutzer anzumelden und ein ID-Token abzurufen, das den Gruppenanspruch enthalten kann. Wenn im ID-Token zu viele Gruppen zur Emission vorhanden sind, verwendet das Beispiel Microsoft Graph SDK für Java, um die Gruppenmitgliedschaftsdaten von Microsoft Graph abzurufen. Basierend auf den Gruppen, zu der der Benutzer gehört, kann der angemeldete Benutzer entweder auf keine, eine oder beide der geschützten Seiten Admins Only
und Regular Users
zugreifen.
Wenn Sie das Verhalten dieses Beispiels replizieren möchten, müssen Sie MSAL4J und Microsoft Graph SDK Ihren Projekten mit Maven hinzufügen. Sie können die pom.xml-Datei und den Inhalt der Hilfs- und authservlets-Ordner im src/main/java/com/microsoft/azuresamples/msal4j kopieren. Außerdem benötigen Sie die authentication.properties-Datei. Diese Klassen und Dateien enthalten generischen Code, den Sie in einer breiten Palette von Anwendungen verwenden können. Sie können auch den Rest des Beispiels kopieren, aber die anderen Klassen und Dateien werden speziell für das Ziel dieses Beispiels erstellt.
Contents
Die folgende Tabelle zeigt den Inhalt des Beispielprojektordners:
Datei/Ordner | Beschreibung |
---|---|
src/main/java/com/microsoft/azuresamples/msal4j/groupswebapp/ | Dieses Verzeichnis enthält die Klassen, die die Back-End-Geschäftslogik der App definieren. |
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ | Dieses Verzeichnis enthält die Klassen, die für Anmelde- und Abmeldeendpunkte verwendet werden. |
____Servlet.java | Alle verfügbaren Endpunkte werden in .java Klassen definiert, die auf ____Servlet.java enden. |
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ | Hilfsklassen für die Authentifizierung. |
AuthenticationFilter.java | Leitet nicht authentifizierte Anforderungen an geschützte Endpunkte auf eine 401-Seite um. |
src/main/resources/authentication.properties | Microsoft Entra ID und Programmkonfiguration. |
src/main/webapp/ | Dieses Verzeichnis enthält die Benutzeroberfläche – JSP-Vorlagen |
CHANGELOG.md | Liste der Änderungen am Beispiel. |
CONTRIBUTING.md | Richtlinien für einen Beitrag zum Beispiel. |
LIZENZ | Die Lizenz für das Beispiel. |
Verarbeiten eines Gruppenanspruchs in Token, einschließlich der Handhabung von Überlastungen
In den folgenden Abschnitten wird beschrieben, wie die App einen Gruppenanspruch verarbeitet.
Der Gruppenanspruch
Die Objekt-ID der Sicherheitsgruppen, bei der der angemeldete Benutzer Mitglied ist, wird im Gruppenanspruch des Tokens zurückgegeben, wie im folgenden Beispiel gezeigt:
{
...
"groups": [
"0bbe91cc-b69e-414d-85a6-a043d6752215",
"48931dac-3736-45e7-83e8-015e6dfd6f7c",]
...
}
Der Gruppenüberlastungsanspruch
Um sicherzustellen, dass die Tokengröße die Grenzwerte für HTTP-Header nicht überschreitet, schränkt die Microsoft Identity Platform die Anzahl der im Gruppenanspruch enthaltenen Objekt-IDs ein.
Die Überschreitungsgrenze beträgt 150 für SAML-Token, 200 für JWT-Token und 6 für Single-Page-Anwendungen. Wenn ein Benutzer Mitglied von mehr Gruppen ist, als die Obergrenze zulässt, gibt die Microsoft Identity Platform die Gruppen-IDs nicht im Gruppenanspruch im Token aus. Stattdessen ist ein Überschreitungsanspruch im Token enthalten, der der Anwendung anzeigt, dass die Microsoft Graph-API abgefragt werden soll, um die Gruppenmitgliedschaft des Benutzers abzurufen, wie im folgenden Beispiel gezeigt:
{
...
"_claim_names": {
"groups": "src1"
},
{
"_claim_sources": {
"src1": {
"endpoint":"[Graph Url to get this user's group membership from]"
}
}
...
}
Erstellen des Überlastungsszenarios in diesem Beispiel zu Testzwecken
Zum Erstellen des Überlastungsszenarios können Sie die folgenden Schritte ausführen:
Sie können die BulkCreateGroups.ps1-Datei im Ordner AppCreationScripts verwenden, um eine große Anzahl von Gruppen zu erstellen und ihnen Benutzer zuzuweisen. Diese Datei hilft beim Testen von Überlastungsszenarien während der Entwicklung. Denken Sie daran, die Benutzer-
objectId
im Skript BulkCreateGroups.ps1 zu ändern.Wenn Sie dieses Beispiel ausführen und eine Überlastung auftritt, wird auf der Startseite
_claim_names
angezeigt, nachdem sich der Benutzer angemeldet hat.Wir empfehlen dringend, dass Sie , wenn möglich, die Gruppenfilterfunktion, um Gruppenüberschreitung zu vermeiden. Weitere Informationen finden Sie im Abschnitt Konfigurieren der Anwendung für den Empfang der Gruppenanspruchswerte aus einem gefilterten Satz von Gruppen, denen ein Benutzer möglicherweise zugewiesen ist.
Falls Sie eine Gruppenüberschreitung nicht vermeiden können, empfehlen wir Ihnen, die folgenden Schritte zu befolgen, um den Gruppenanspruch auf Ihrem Token zu bearbeiten:
- Suchen Sie nach dem Anspruch
_claim_names
mit einem der Werte Gruppen. Dieser Anspruch gibt eine Überschreitung an. - Falls gefunden, rufen Sie den Endpunkt auf, der in
_claim_sources
angegeben ist, um die Gruppen des Benutzers abzurufen. - Wenn nicht gefunden, sehen Sie sich den Gruppenanspruch für die Gruppen an.
- Suchen Sie nach dem Anspruch
Hinweis
Für die Verarbeitung von Überschreitungen ist ein Aufruf von Microsoft Graph erforderlich, um die Gruppenmitgliedschaften des angemeldeten Benutzers zu lesen. Daher muss Ihre App über die Berechtigung GroupMember.Read.All verfügen, damit die getMemberObjects-Funktion erfolgreich ausgeführt werden kann.
Weitere Informationen zur Programmierung für Microsoft Graph finden Sie im Video Eine Einführung in Microsoft Graph für Entwickler.
ConfidentialClientApplication
Eine ConfidentialClientApplication
Instanz wird in der AuthHelper.java-Datei erstellt, wie im folgenden Beispiel gezeigt. Dieses Objekt hilft beim Erstellen der Microsoft Entra-Autorisierungs-URL und auch beim Austauschen des Authentifizierungstokens für ein Zugriffstoken.
// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
.builder(CLIENT_ID, secret)
.authority(AUTHORITY)
.build();
Es werden die folgenden Parameter für die Instanziierung verwendet:
- Die Client-ID der App.
- Der geheime Clientschlüssel, der eine Anforderung für vertrauliche Clientanwendungen ist.
- Die Microsoft Entra ID Authority, die Ihre Microsoft Entra-Mandanten-ID enthält.
In diesem Beispiel werden diese Werte aus der Datei authentication.properties mithilfe eines Eigenschaftenlesers in der Config.java-Datei gelesen.
Ausführliche exemplarische Vorgehensweise
Die folgenden Schritte bieten eine exemplarische Vorgehensweise für die Funktionalität der App:
Der erste Schritt des Anmeldeprozesses besteht darin, eine Anforderung an den
/authorize
-Endpunkt des Microsoft Entra ID-Mandanten zu senden. DieConfidentialClientApplication
-Instanz von MSAL4J wird verwendet, um eine Autorisierungsanforderungs-URL zu erstellen. Die App leitet den Browser an diese URL um, über die der Benutzer sich dann anmeldet.final ConfidentialClientApplication client = getConfidentialClientInstance(); AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES)) .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build(); final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString(); contextAdapter.redirectUser(authorizeUrl);
In der folgenden Liste werden die Features dieses Codes beschrieben:
AuthorizationRequestUrlParameters
: Diese Parameter müssen zum Erstellen einer AuthorizationRequestUrl-Klasse festgelegt werden.REDIRECT_URI
: Wo Microsoft Entra den Browser - zusammen mit dem Authentifizierungscode - umleitet, nachdem Benutzeranmeldeinformationen gesammelt wurden. Er muss mit dem Umleitungs-URI in der Microsoft Entra ID-App-Registrierung im Azure-Portal übereinstimmen.SCOPES
: Bereiche stellen die Berechtigungen dar, die von der Anwendung angefordert wurden.- Normalerweise reichen die drei Bereiche
openid profile offline_access
aus, um eine ID-Token-Antwort zu erhalten. - Vollständige Liste der von der App angeforderten Bereiche finden Sie in der Datei authentication.properties. Sie können weitere Bereiche hinzufügen, Beispiel:
User.Read
.
- Normalerweise reichen die drei Bereiche
Microsoft Entra ID zeigt der*dem Benutzer*in eine Anmeldeeingabeaufforderung an. Wenn der Anmeldeversuch erfolgreich ist, wird der Browser des Benutzers zum Umleitungsendpunkt dieser App umgeleitet. Eine erfolgreiche Anforderung an diesen Endpunkt enthält einen Autorisierungscode.
Die
ConfidentialClientApplication
-Instanz tauscht diesen Autorisierungscode dann für ein ID-Token und ein Zugriffstoken von Microsoft Entra ID aus.// First, validate the state, then parse any error codes in response, then extract the authCode. Then: // build the auth code params: final AuthorizationCodeParameters authParams = AuthorizationCodeParameters .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build(); // Get a client instance and leverage it to acquire the token: final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance(); final IAuthenticationResult result = client.acquireToken(authParams).get();
In der folgenden Liste werden die Features dieses Codes beschrieben:
AuthorizationCodeParameters
: Diese Parameter müssen festgelegt werden, damit der Autorisierungscode für ein ID- und/oder ein Zugriffstoken ausgetauscht werden kann.authCode
: Hierbei handelt es sich um den Autorisierungscode, der am Umleitungsendpunkt empfangen wurde.REDIRECT_URI
: Der im vorherigen Schritt verwendete Umleitungs-URI muss noch mal übergeben werden.SCOPES
: Die im vorherigen Schritt verwendeten Bereiche müssen noch einmal übergeben werden.
Wenn
acquireToken
erfolgreich ausgeführt wird, werden die Tokenansprüche extrahiert. Wenn die Nonce-Überprüfung erfolgreich ist, werden die Ergebnisse incontext
(eine Instanz vonIdentityContextData
) platziert und in der Sitzung gespeichert. Die Anwendung kannIdentityContextData
dann aus der Sitzung (mithilfe einerIdentityContextAdapterServlet
-Instanz) instanziieren, wenn sie Zugriff benötigt, wie im folgenden Code gezeigt:// parse IdToken claims from the IAuthenticationResult: // (the next step - validateNonce - requires parsed claims) context.setIdTokenClaims(result.idToken()); // if nonce is invalid, stop immediately! this could be a token replay! // if validation fails, throws exception and cancels auth: validateNonce(context); // set user to authenticated: context.setAuthResult(result, client.tokenCache().serialize()); // handle groups overage if it has occurred. handleGroupsOverage(contextAdapter);
Nach dem vorherigen Schritt können Sie Gruppenmitgliedschaften extrahieren, indem Sie
context.getGroups()
eine Instanz vonIdentityContextData
verwenden.Wenn der Benutzer Mitglied von zu vielen Gruppen ist (mehr als 200) ist ein Aufruf an
context.getGroups()
möglicherweise leer, wenn es nicht der Aufruf vonhandleGroupsOverage()
ist. In der Zwischenzeitcontext.getGroupsOverage()
gibttrue
zurück und signalisiert damit, dass eine Überschreitung aufgetreten ist und das Abrufen der vollständigen Liste von Gruppen einen Aufruf von Microsoft Graph erfordert. Sehen Sie sich diehandleGroupsOverage()
-Methode in AuthHelper.java an, um zu sehen, wie diese Anwendungcontext.setGroups()
verwendet, wenn eine Überschreitung vorhanden ist.
Schützen der Routen
Sehen Sie sich AuthenticationFilter.java an, um zu sehen, wie die Beispiel-App den Zugriff auf Routen filtert. In der Datei authentication.properties enthält die Eigenschaft app.protect.authenticated
die durch Trennzeichen getrennten Routen, auf die nur authentifizierte Benutzer zugreifen können, wie im folgenden Beispiel gezeigt:
# for example, /token_details requires any user to be signed in and does not require special groups claim
app.protect.authenticated=/token_details
Alle Routen, die in den durch Trennzeichen getrennten Regelsätzen unter app.protect.groups
aufgelistet sind, sind auch für nicht authentifizierte Benutzer nicht verwendbar, wie im folgenden Beispiel gezeigt. Diese Routen enthalten jedoch auch eine durch Leerzeichen getrennte Liste von Gruppenmitgliedschaften. Nur Benutzer, die mindestens einer der entsprechenden Gruppen angehören, können nach der Authentifizierung auf diese Routen zugreifen.
# define short names for group IDs here for the app. This is useful in the next property (app.protect.groups).
# EXCLUDE the curly braces, they are in this file only as delimiters.
# example:
# app.groups=groupA abcdef-qrstuvw-xyz groupB abcdef-qrstuv-wxyz
app.groups=admin {enter-your-admins-group-id-here}, user {enter-your-users-group-id-here}
# A route and its corresponding group(s) that can view it, <space-separated>; the start of the next route & its group(s) is delimited by a <comma-and-space-separator>
# this says: /admins_only can be accessed by admin group, /regular_user can be accessed by admin group and user group
app.protect.groups=/admin_only admin, /regular_user admin user
Bereiche
Bereiche teilen Microsoft Entra ID die Zugriffsebene mit, die die Anwendung anfordert.
Auf Grundlage der angeforderten Bereiche zeigt Microsoft Entra ID dem Benutzer bei der Anmeldung ein Einwilligungsdialogfeld an. Wenn der Benutzer in einen oder mehrere Bereiche einwilligt und ein Token erhält, werden die Bereiche in das resultierende access_token
codiert.
Die von der Anwendung angeforderten Bereiche finden Sie unter authentication.properties. Standardmäßig legt die Anwendung den Bereichswert auf GroupMember.Read.All
. Dieser spezielle Microsoft Graph-API-Bereich ist erforderlich, falls die Anwendung Graph aufrufen muss, um die Gruppenmitgliedschaften des Benutzers abzurufen.
Weitere Informationen
- MSAL (Microsoft Authentication Library) für Java
- Microsoft Identity Platform (Microsoft Entra ID für Entwickler)
- Schnellstart: Registrieren einer Anwendung bei Microsoft Identity Platform
- Grundlegendes zu Einwilligungserfahrungen für Microsoft Entra ID-Anwendungen
- Grundlegendes zur Benutzer- und Administratoreinwilligung
- MSAL-Codebeispiele