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 der 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.
Das folgende Diagramm zeigt die Topologie der App:
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 abdeckt, 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 Abrufen eines Microsoft Entra ID-Mandanten.
- Ein Benutzerkonto in Ihrem eigenen Microsoft Entra ID-Mandanten.
- Zwei Sicherheitsgruppen und
GroupMember
, die Benutzer enthalten,GroupAdmin
mit denen Sie testen möchten.
Empfehlungen
- Einige Kenntnisse mit den Java / Jakarta Servlets.
- Vertrautheit mit Linux/OSX-Terminal oder Windows PowerShell.
- jwt.ms zum Überprüfen Ihrer Token.
- Fiddler zur Überwachung Ihrer Netzwerkaktivität und Problembehandlung.
- Folgen Sie dem Microsoft Entra ID-Blog , um mit den neuesten Entwicklungen auf dem neuesten Stand zu bleiben.
Einrichten des Beispiels
In den folgenden Abschnitten wird gezeigt, wie Sie die Beispielanwendung einrichten.
Klonen oder Herunterladen des Beispiel-Repositorys
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-java-servlet-webapp-authentication.git
cd 3-Authorization-II/groups
Navigieren Sie alternativ zum Repository "ms-identity-java-servlet-webapp-authentication ", und laden Sie sie dann als .zip Datei herunter, und extrahieren Sie sie auf Ihre Festplatte.
Wichtig
Um Dateipfadlängenbeschränkungen für Windows zu vermeiden, klonen Oder extrahieren Sie das Repository in ein Verzeichnis in der Nähe des Stammverzeichnisses Ihrer Festplatte.
Registrieren der Beispielanwendung bei Ihrem Microsoft Entra ID-Mandanten
In diesem Beispiel gibt es ein Projekt. Um die App auf dem Azure-Portal zu registrieren, können Sie entweder manuelle Konfigurationsschritte ausführen oder ein PowerShell-Skript verwenden. Das Skript führt folgende Aufgaben aus:
- Erstellt die Microsoft Entra-ID-Anwendungen und verwandte Objekte, z. B. Kennwörter, Berechtigungen und Abhängigkeiten.
- Ändert die Projektkonfigurationsdateien.
- Richten Sie standardmäßig eine Anwendung ein, die nur mit Konten in Ihrem Organisationsverzeichnis funktioniert.
Führen Sie die folgenden Schritte aus, um das PowerShell-Skript auszuführen:
Öffnen Sie unter Windows PowerShell, und navigieren Sie zum Stammverzeichnis des geklonten Verzeichnisses.
Verwenden Sie den folgenden Befehl, um die Ausführungsrichtlinie für PowerShell festzulegen:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
Verwenden Sie die folgenden Befehle, um das Konfigurationsskript auszuführen:
cd .\AppCreationScripts\ .\Configure.ps1
Hinweis
Weitere Methoden zum Ausführen der Skripts werden in App-Erstellungsskripts beschrieben. Die Skripts bieten auch einen Leitfaden zur automatisierten Anwendungsregistrierung, Konfiguration und Entfernung, die in Ihren CI/CD-Szenarien hilfreich sein kann.
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 ClientID
ist identisch mit Application ID
oder AppId
.
Öffnen Sie das Projekt in Ihrer IDE.
Öffnen Sie die Datei ./src/Standard/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" in diesem Organisationsverzeichnis registriert haben.Suchen Sie die Zeichenfolge
{enter-your-client-id-here}
, und ersetzen Sie den vorhandenen Wert durch die Anwendungs-ID oderclientId
die Anwendung, diejava-servlet-webapp-groups
aus der Azure-Portal kopiert wurde.Suchen Sie die Zeichenfolge
{enter-your-client-secret-here}
, und ersetzen Sie den vorhandenen Wert durch den Wert, den Sie während der Erstellung derjava-servlet-webapp-groups
App gespeichert haben, im Azure-Portal.
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 Kostenlosen Version der Microsoft Entra ID nicht verfügbar.
Hinweis
Informationen zum Abrufen der lokalen Gruppe samAccountName
oder On Premises Group Security Identifier
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 Sie Ihre Anwendung so, dass alle Gruppen empfangen werden, denen der angemeldete Benutzer zugewiesen ist, einschließlich geschachtelter Gruppen
Führen Sie die folgenden Schritte aus, um Ihre Anwendung zu konfigurieren:
Wählen Sie auf der Registrierungsseite der App im Navigationsbereich die 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 die Option "Alle Gruppen" aus (einschließlich Verteilerlisten, aber nicht gruppen, die der Anwendung zugewiesen sind). 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
Dieses Feature ist in der Kostenlosen Version der Microsoft Entra ID nicht verfügbar.
Geschachtelte Gruppenzuweisungen sind nicht verfügbar, wenn Sie diese Option verwenden.
Führen Sie die folgenden Schritte aus, um diese Option in Ihrer App zu aktivieren:
Wählen Sie auf der Registrierungsseite der App im Navigationsbereich die 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 "Gruppen" aus, die der Anwendung zugewiesen sind.
Wenn Sie zusätzliche Optionen auswählen , z . B. Sicherheitsgruppen oder alle Gruppen (einschließlich Verteilerlisten, aber nicht gruppen, die der Anwendung zugewiesen sind), werden die Vorteile, die Ihre App von der Auswahl dieser Option abweicht, abgesehen.
Wählen Sie im Abschnitt "ID" die Option "Gruppen-ID" aus. Dies 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 "Access " auswählen. Diese Option 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 den Link mit dem Namen Ihrer Anwendung in der verwalteten Anwendung im lokalen Verzeichnis aus. Dieser Feldtitel kann abgeschnitten werden , z. B
Managed application in ...
. . Wenn Sie diesen Link auswählen, navigieren Sie zur Seite "Unternehmensanwendungsübersicht" , die dem Dienstprinzipal für Ihre Anwendung im Mandanten zugeordnet ist, in dem Sie ihn 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 resultierenden Bildschirm "Benutzer und Gruppen " aus.
Wählen Sie die Gruppen aus, die Sie dieser Anwendung zuweisen möchten.
Wählen Sie "Auswählen " aus, 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 die erforderliche Benutzerzuweisung fest? Kennzeichnung auf "Ja".
Wichtig
Wenn Sie die Benutzerzuweisung auf"Ja" festlegen, überprüft die Microsoft Entra-ID, dass nur Benutzer, die Ihrer Anwendung im Bereich "Benutzer und Gruppen" zugewiesen sind, sich bei Ihrer App anmelden können. Sie können Benutzer direkt zuweisen oder Sicherheitsgruppen zuweisen, zu der sie gehören.
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. DNSDo Standard\sAMAccountName) ausgewählt haben, sollten Sie den Gruppennamen in den folgenden Schritten eingeben , z contoso.com\Test Group
. B. anstelle der Objekt-ID:
Öffnen Sie die Datei ./src/Standard/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 der Azure-Portal kopiert haben. Entfernen Sie auch die geschweiften 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 der Azure-Portal kopiert haben. Entfernen Sie auch die geschweiften 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 einer Vielzahl von Anwendungsservern ausführen können.
Ausführen des Beispiels
In den folgenden Abschnitten wird gezeigt, wie Sie das Beispiel für Azure-App Dienst 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
Wenn Sie die Bereitstellung für Azure-App Dienst bereitstellen, verwendet die Bereitstellung automatisch Ihre Azure-Anmeldeinformationen aus der Azure CLI. 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.
Führen Sie die folgenden Schritte aus, um das Plug-In zu konfigurieren:
Führen Sie den folgenden Befehl aus, um die Bereitstellung zu konfigurieren. Mit diesem Befehl können Sie das Azure-App Dienstbetriebssystem, die Java-Version und die Tomcat-Version einrichten.
mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config
Drücken Sie für die Konfiguration "Neue Ausführung erstellen" Y, und drücken Sie dann die EINGABETASTE.
Drücken Sie zum Definieren des Werts für das Betriebssystem 1 für Windows oder 2 für Linux, und drücken Sie dann die EINGABETASTE.
Drücken Sie für "Define value for javaVersion" 2 für Java 11, und drücken Sie dann die EINGABETASTE.
Drücken Sie für "Wert definieren" für "webContainer" 4 für Tomcat 9.0, und drücken Sie dann die EINGABETASTE.
Drücken Sie zum Definieren des Werts für "pricingTier" die EINGABETASTE, um die standardebene P1v2 auszuwählen.
Drücken Sie für "Bestätigen" Y, und drücken Sie 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 zur pom.xml Datei Ihres Projekts hinzu, um Ihre App so zu konfigurieren, dass sie in Azure-App Dienst ausgeführt wird.
Der relevante Teil der pom.xml Datei sollte dem folgenden Beispiel ähneln:
<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 Ihrem 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 | Das Preisniveau für Ihre App. Der Standardwert ist P1v2 für eine Produktionsauslastung. Der empfohlene Mindestwert für die Java-Entwicklung und -Tests ist B2 . Weitere Informationen finden Sie unter App Service Pricing. |
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 teilen einen gemeinsamen Satz von Konfigurationen. Informationen zu diesen Konfigurationen finden Sie unter "Allgemeine Konfigurationen". Konfigurationen, die für Azure-App Dienst spezifisch sind, finden Sie unter Azure-App: Konfigurationsdetails.
Achten Sie darauf, die Werte für resourceGroup
die appName
spätere Verwendung beiseite zu speichern.
Vorbereiten der App für die Bereitstellung
Wenn Sie Ihre Anwendung im App-Dienst 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 Eigenschaftendatei zu ändern:
Navigieren Sie zur Datei "authentication.properties" Ihrer App, und ändern Sie den Wert der
app.homePage
bereitgestellten App Standard Name, wie im folgenden Beispiel gezeigt. Wenn Sie z. B. im vorherigen Schritt den App-Namen ausgewählt habenexample-domain
, müssen Sie jetzt denapp.homePage
Wert verwendenhttps://example-domain.azurewebsites.net
. Stellen Sie sicher, dass Sie das Protokoll auch von "inhttp
https
" 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 Ihre 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 "Deploy to App Service – Remove secret ". Diese Anleitung fügt zusätzliche Schritte zum Pushen des geheimen Werts an Key Vault und zum Verwenden von Key Vault-Verweisen hinzu.
Aktualisieren Ihrer Microsoft Entra ID-App-Registrierung
Da sich der Umleitungs-URI an Ihre bereitgestellte App in Azure-App Dienst ä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 ,
java-servlet-webapp-authentication
z. B. .Öffnen Sie die App-Registrierung, indem Sie den Namen auswählen.
Wählen Sie im oberen Menü Authentifizierung aus.
Wählen Sie im Abschnitt "Webumleitungs-URIs - " die Option "URI hinzufügen" aus.
Füllen Sie den URI Ihrer App aus,
https://<your-app-name>.azurewebsites.net/auth/redirect
z. B. anfügen/auth/redirect
.Wählen Sie Speichern.
Bereitstellen der App
Sie können Ihre App jetzt für Azure-App Dienst 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 Konfigurationen in Ihrer pom.xml-Datei bereit sind, können Sie jetzt den folgenden Befehl verwenden, um Ihre Java-App in Azure bereitzustellen:
mvn package azure-webapp:deploy
Nach Abschluss der Bereitstellung ist Ihre Anwendung bereit unter http://<your-app-name>.azurewebsites.net/
. Öffnen Sie die URL mit Ihrem lokalen Webbrowser, in dem die Startseite der msal4j-servlet-auth
Anwendung angezeigt werden soll.
Untersuchen des Beispiels
Führen Sie die folgenden Schritte aus, 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 liest die Anmeldung , 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 Zustimmungsbildschirm die bereiche, die angefordert werden.
- Beachten Sie, dass die Kontextsensitive Schaltfläche jetzt "Abmelden" anzeigt und Ihren Benutzernamen anzeigt.
- Wählen Sie ID-Tokendetails aus, um einige der 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 das 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
zugreifen und Regular Users
.
Wenn Sie das Verhalten dieses Beispiels replizieren möchten, müssen Sie MSAL4J und Microsoft Graph SDK zu Ihren Projekten mit Maven hinzufügen. Sie können die pom.xml Datei und den Inhalt der Hilfs- und Authentifizierungsordner im Ordner "src/Standard/java/com/microsoft/azuresamples/msal4j" kopieren. Außerdem benötigen Sie die Datei "authentication.properties ". 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 |
---|---|
AppCreationScripts/ | Skripts zum automatischen Konfigurieren von Microsoft Entra ID-App-Registrierungen. |
src/Standard/java/com/microsoft/azuresamples/msal4j/groupswebapp/ | Dieses Verzeichnis enthält die Klassen, die die Back-End-Geschäftslogik der App definieren. |
src/Standard/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/Standard/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/Standard/resources/authentication.properties | Microsoft Entra ID und Programmkonfiguration. |
src/Standard/webapp/ | Dieses Verzeichnis enthält die Benutzeroberfläche – JSP-Vorlagen |
CHANGELOG.md | Liste der Änderungen am Beispiel. |
CONTRIBUTING.md | Richtlinien für einen Beitrag zur Stichprobe. |
LIZENZ | Die Lizenz für das Beispiel. |
Verarbeiten eines Gruppenanspruchs in Token, einschließlich Der Verarbeitung von Überlastung
In den folgenden Abschnitten wird beschrieben, wie die App einen Gruppenanspruch verarbeitet.
Der Anspruch der Gruppen
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",]
...
}
Überlastungsanspruch der Gruppen
Um sicherzustellen, dass die Tokengröße die Grenzwerte für HTTP-Header nicht überschreitet, beschränkt die Microsoft Identity Platform die Anzahl der Objekt-IDs, die sie in den Gruppenanspruch einschließt.
Der Grenzwert für Überschreitungen 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 Überlastungsgrenze, gibt die Microsoft Identity Platform die Gruppen-IDs in den Gruppenanspruch im Token nicht aus. Stattdessen enthält sie einen Überlastungsanspruch im Token, der angibt, dass die Anwendung die Microsoft Graph-API abfragt, 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 im Ordner "AppCreationScripts.ps1" bereitgestellte Datei "BulkCreateGroups.ps1" 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 im Skript "BulkCreateGroups.ps1" bereitgestellten
objectId
Benutzer zu ändern.Wenn Sie dieses Beispiel ausführen und eine Überlastung auftritt, wird die
_claim_names
Auf der Startseite angezeigt, nachdem sich der Benutzer angemeldet hat.Wir empfehlen dringend, dass Sie die Gruppenfilterfunktion verwenden, wenn möglich, um Gruppenübergänge 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 die Überlastung von Gruppen nicht vermeiden können, empfehlen wir Ihnen die folgenden Schritte, um den Gruppenanspruch in Ihrem Token zu verarbeiten:
- Suchen Sie nach dem Anspruch
_claim_names
mit einem der Werte, die gruppen sind. Dies gibt eine Überlastung an. - Wenn gefunden, rufen Sie den endpunkt an, der angegeben
_claim_sources
ist, um die Gruppen des Benutzers abzurufen. - Wenn keine gefunden wurde, sehen Sie sich den Gruppenanspruch für die Gruppengruppen an.
- Suchen Sie nach dem Anspruch
Hinweis
Für die Verarbeitung von Überlastungen 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 datei AuthHelper.java erstellt, wie im folgenden Beispiel gezeigt. Dieses Objekt hilft beim Erstellen der Microsoft Entra-Autorisierungs-URL und hilft 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();
Die folgenden Parameter werden 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 datei Config.java gelesen.
Ausführliche exemplarische Vorgehensweise
Die folgenden Schritte bieten eine exemplarische Vorgehensweise für die Funktionalität der App:
Der erste Schritt des Anmeldevorgangs besteht darin, eine Anforderung an den
/authorize
Endpunkt für Ihren Microsoft Entra ID-Mandanten zu senden. Die MSAL4J-InstanzConfidentialClientApplication
wird verwendet, um eine Autorisierungsanforderungs-URL zu erstellen. Die App leitet den Browser zu dieser URL um, wo sich der Benutzer 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
: Parameter, die festgelegt werden müssen, um eine AuthorizationRequestUrl zu erstellen.REDIRECT_URI
: Wo Microsoft Entra den Browser zusammen mit dem Authentifizierungscode umleitet, nachdem Benutzeranmeldeinformationen gesammelt wurden. Sie muss mit dem Umleitungs-URI in der Microsoft Entra ID-App-Registrierung im Azure-Portal übereinstimmen.SCOPES
: Bereiche sind Berechtigungen, die von der Anwendung angefordert werden.- Normalerweise reichen die drei Bereiche
openid profile offline_access
für den Empfang einer ID-Tokenantwort aus. - Vollständige Liste der von der App angeforderten Bereiche finden Sie in der Datei "authentication.properties ". Sie können weitere Bereiche wie User.Read usw. hinzufügen.
- 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 an den Umleitungsendpunkt der App umgeleitet. Eine gültige Anforderung an diesen Endpunkt enthält einen Autorisierungscode.
Anschließend wechselt die
ConfidentialClientApplication
Instanz diesen Autorisierungscode für ein ID-Token und Zugriffstoken aus der Microsoft Entra-ID.// 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
: Parameter, die festgelegt werden müssen, um den Autorisierungscode für eine ID und/oder ein Zugriffstoken auszutauschen.authCode
: Der Autorisierungscode, der am Umleitungsendpunkt empfangen wurde.REDIRECT_URI
: Der im vorherigen Schritt verwendete Umleitungs-URI muss erneut übergeben werden.SCOPES
: Die im vorherigen Schritt verwendeten Bereiche müssen erneut übergeben werden.
Wenn
acquireToken
erfolgreich ausgeführt wird, werden die Tokenansprüche extrahiert. Wenn die Nonce-Prüfung erfolgreich ist, werden die Ergebnisse -context
eine Instanz vonIdentityContextData
- in der Sitzung gespeichert. Die Anwendung kann die Anwendung dann über eine InstanzIdentityContextAdapterServlet
instanziierenIdentityContextData
, wenn sie darauf zugreifen muss, 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
context.getGroups()
Sie eine Instanz vonIdentityContextData
.Wenn der Benutzer Mitglied von zu vielen Gruppen ist – mehr als 200 – war möglicherweise ein Anruf
context.getGroups()
leer, wenn er nicht für den Anruf warhandleGroupsOverage()
.context.getGroupsOverage()
Gibt in der Zwischenzeit zurücktrue
, signalisiert, dass eine Überlastung aufgetreten ist und dass 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 Anwendung verwendetcontext.setGroups()
wird, wenn eine Überlastung vorhanden ist.
Schützen der Routen
Sehen Sie sich AuthenticationFilter.java an, wie die Beispiel-App den Zugriff auf Routen filtert. In der Datei "authentication.properties " enthält die app.protect.authenticated
Eigenschaft 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 app.protect.groups
aufgelistet sind, sind auch für nicht authentifizierte authentifizierte Benutzer außer Grenzen, 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 mit, welche Zugriffsebene die Anwendung anfordert.
Basierend auf den angeforderten Bereichen stellt die Microsoft Entra-ID dem Benutzer bei der Anmeldung einen Zustimmungsdialog vor. Wenn der Benutzer einem oder mehreren Bereichen zustimmt und ein Token abruft, werden die Bereiche, die zugestimmt haben, 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 zur Zustimmung der Microsoft Entra-ID-Anwendung
- Grundlegendes zur Benutzer- und Administratoreinwilligung
- MSAL-Codebeispiele
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für