Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Richten Sie Single Sign-On (SSO) für eine Fabric-App ein, damit sich Benutzer über das Fabric-Portal mit Microsoft Entra ID anmelden können. In diesem Artikel wird der Übergabefluss erläutert und erläutert, wie Sie die erforderliche Konfiguration und SDK-Integration für bereitgestellte Apps aktivieren.
Voraussetzungen
- Ein Fabric-Apps-Projekt mit aktivierter Authentifizierung. Siehe Konfigurieren der Authentifizierung.
- Ein bereitgestelltes Fabric Apps-Objekt. Siehe Deploy to Fabric.
Funktionsweise von Fabric SSO
Fabric-Single Sign-On (SSO) verwendet eine sichere postMessage-basierte Weiterleitung zwischen Ihrer Anwendung und dem Fabric-Portal. Es gibt keine Umleitungs- oder Rückrufseite:
- Ihre App öffnet das Fabric-Portal in einem Pop-up und registriert einen
postMessage-Listener. - Der Benutzer authentifiziert sich über Microsoft Entra ID im Fabric-Portal.
- Die Fabric-Erweiterung sendet den Handoffcode über
window.opener.postMessage()an Ihre App zurück. - Das SDK wechselt den Übergabecode für Rayfin-Sitzungstoken und erstellt eine Sitzung.
- Das Fabric-Pop-up schließt sich automatisch.
Der Ablauf wird mit PKCE (Proof Key for Code Exchange), State-Nonces und postMessage Origin-Validierung abgesichert, um das Abfangen von Autorisierungscodes und siteübergreifende Anfragenfälschung zu verhindern.
Fabric Authentifizierung aktivieren
Fügen Sie der Datei rayfin/rayfin.yml die Fabric-Authentifizierungskonfiguration hinzu:
services:
auth:
enabled: true
allowedRedirectUris:
- http://localhost:5173
fabric:
enabled: true
Für bereitgestellte Anwendungen erneut bereitstellen, um die aktualisierten Einstellungen zu übernehmen:
npx rayfin up
Für bereitgestellte Apps fügt npx rayfin up die Rückruf-URL Ihrer bereitgestellten App zu allowedRedirectUris hinzu.
Installieren des Fabric Authentifizierungsanbieters (optional)
Projekte, die mit npm create @microsoft/rayfin@latest erstellt wurden, enthalten bereits @microsoft/rayfin-auth-provider-fabric. Installieren Sie sie manuell nur, wenn Sie Fabric Authentifizierung zu einem Projekt hinzufügen, das noch nicht über das Paket verfügt:
npm install @microsoft/rayfin-auth-provider-fabric
Hinzufügen der Anmeldung und Registrierung für Ihre App
Fabric SSO verwendet eine einzelne API sowohl für die Anmeldung als auch für die Registrierung: ensureSignedInWithFabric(). Wenn sich ein Benutzer zum ersten Mal anmeldet, stellt Fabric automatisch eine Rayfin-Sitzung für sie basierend auf ihrer Microsoft Entra ID Identität fest – es gibt keinen separaten Anmeldeanruf. Derselbe Codepfad wird auch für wiederkehrende Benutzer verwendet.
Sie können diesen Code manuell hinzufügen oder mit GitHub Copilot in VS Code generieren.
Manuelles Hinzufügen der Anmeldung
Rufen Sie ensureSignedInWithFabric() in einem Handler für Benutzergesten auf (z. B. bei der Auswahl einer Schaltfläche):
import { RayfinClient } from '@microsoft/rayfin-client';
import { ensureSignedInWithFabric } from '@microsoft/rayfin-auth-provider-fabric';
const client = new RayfinClient({
baseUrl: import.meta.env.VITE_RAYFIN_API_URL,
publishableKey: import.meta.env.VITE_RAYFIN_PUBLISHABLE_KEY,
});
const fabricOptions = {
workspaceId: import.meta.env.VITE_FABRIC_WORKSPACE_ID,
projectId: import.meta.env.VITE_FABRIC_ITEM_ID,
fabricPortalUrl: import.meta.env.VITE_FABRIC_PORTAL_URL,
returnOrigin: window.location.origin,
};
async function handleSignIn() {
// Signs in existing users and provisions new users on first sign-in.
const session = await ensureSignedInWithFabric(client.auth, fabricOptions);
if (session.isAuthenticated && session.user) {
console.log('Signed in as:', session.user.email);
}
}
Die Funktion muss von einem synchronen Benutzergestenhandler aufgerufen werden, um Popupblocker zu vermeiden. Wird dies beim Laden der Seite oder in einer asynchronen Kette vor der Benutzerinteraktion aufgerufen, wird der Popup-Schutz des Browsers ausgelöst.
returnOrigin muss ein reiner Ursprung sein (nur Schema und Host, ohne Pfad) – zum Beispiel https://app.contoso.com. Das SDK verwendet es zum Überprüfen eingehender postMessage Ereignisse.
Abmelden manuell hinzufügen
Aufrufen client.auth.signOut() zum Beenden der Sitzung und Löschen zwischengespeicherter Token:
async function handleSignOut() {
await client.auth.signOut();
console.log('Signed out');
}
Abonnieren Sie Sitzungsänderungen, um Ihre Benutzeroberfläche zu aktualisieren, wenn die Anmeldung abgeschlossen ist oder die Abmeldung abgeschlossen ist:
client.auth.onSessionChange((session) => {
console.log('Session changed:', session?.isAuthenticated ? 'signed in' : 'signed out');
});
Anmeldung und Registrierung mit GitHub Copilot erstellen
Wenn Sie GitHub Copilot in VS Code verwenden, öffnen Sie Copilot Chat in Ihrem Fabric Apps-Projekt, und verwenden Sie Eingabeaufforderungen wie diese, um den Authentifizierungscode zu erstellen. Copilot folgt den Mustern in der Rayfin-Fähigkeit, die mit der Fabric VS Code Erweiterung gebündelt ist.
| Zielsetzung | Beispiel Copilot-Prompt |
|---|---|
| Hinzufügen einer Anmeldeschaltfläche | Add a Sign in with Fabric button to my React app using ensureSignedInWithFabric from @microsoft/rayfin-auth-provider-fabric. Read workspaceId, projectId, and fabricPortalUrl from VITE_* env vars and set returnOrigin to window.location.origin. |
| Schaltfläche "Abmelden hinzufügen" | Add a Sign out button that calls client.auth.signOut() and updates the UI when the session ends. |
| Hinzufügen eines Authentifizierungsfähigen React-Hooks | Create a useFabricAuth React hook that exposes session, signIn, signOut, and isAuthenticated, using ensureSignedInWithFabric and client.auth.onSessionChange. |
| Unterstützen des eingebetteten Modus | Update my app's entry point to call initEmbeddedAuth on page load so users signed in through the Fabric portal don't have to click Sign in again. |
| Eine Route sperren | Wrap the /dashboard route so it calls ensureSignedInWithFabric before rendering and redirects unauthenticated users to a sign-in page. |
Nachdem Copilot Code generiert hat, überprüfen Sie die Bearbeitungen, und stellen Sie folgendes sicher:
- Der
ensureSignedInWithFabric()-Aufruf wird innerhalb eines Handlers für Benutzergesten ausgeführt (zum BeispielonClick) – nicht beim Laden der Seite. -
returnOriginist ein reiner Ursprung und entspricht einem der Einträge inallowedRedirectUrisinrayfin/rayfin.yml. - Importe stammen aus
@microsoft/rayfin-auth-provider-fabric(nicht die veralteten Rückrufhilfen).
Einbettungsmodus innerhalb eines Fabric-IFrames verwenden
Wenn Ihre App in einem Fabric iframe geladen wird (z. B. wenn ein Benutzer sie über das Fabric Portal öffnet), verwenden Sie den eingebetteten Modus anstelle des Popupflusses:
- Der eingebettete Modus übernimmt die Sitzung bis
postMessagezum übergeordneten Frame. - Es öffnet kein Pop-up und erfordert keine Nutzerinteraktion, daher kann es beim Laden der Seite bedenkenlos aufgerufen werden.
- Das SDK erkennt den eingebetteten Modus automatisch aus
?fabricEmbedded=trueder URL. Sie können sie auch erzwingen, indem Sie sie in den Optionen festlegenfabricEmbedded: true.
Frühzeitiger Anruf initEmbeddedAuth() beim Starten der App:
import { initEmbeddedAuth } from '@microsoft/rayfin-auth-provider-fabric';
import { client } from './lib/rayfin';
const session = await initEmbeddedAuth(client.auth, {
workspaceId: import.meta.env.VITE_FABRIC_WORKSPACE_ID,
projectId: import.meta.env.VITE_FABRIC_ITEM_ID,
fabricPortalUrl: import.meta.env.VITE_FABRIC_PORTAL_URL,
returnOrigin: window.location.origin,
});
if (session) {
console.log('Signed in via embedded mode:', session.user?.email);
}
initEmbeddedAuth() gibt null zurück, wenn die App nicht im eingebetteten Modus ausgeführt wird, daher kann sie bedenkenlos immer aufgerufen werden.
ensureSignedInWithFabric() versucht außerdem automatisch, den eingebetteten Modus zu verwenden, bevor auf den Popup-Ablauf zurückgegriffen wird.
Fabric-Authentifizierung in React verwenden
Erstellen Sie einen benutzerdefinierten Hook, der Die Anmeldung, Registrierung und Abmeldung integriert:
import { useState, useEffect, useCallback } from 'react';
import { ensureSignedInWithFabric } from '@microsoft/rayfin-auth-provider-fabric';
import { client } from './lib/rayfin';
const fabricOptions = {
workspaceId: import.meta.env.VITE_FABRIC_WORKSPACE_ID,
projectId: import.meta.env.VITE_FABRIC_ITEM_ID,
fabricPortalUrl: import.meta.env.VITE_FABRIC_PORTAL_URL,
returnOrigin: window.location.origin,
};
export function useFabricAuth() {
const [session, setSession] = useState(client.auth.getSession());
useEffect(() => client.auth.onSessionChange(setSession), []);
// Signs in existing users and provisions new users on first sign-in.
const signIn = useCallback(async () => {
const result = await ensureSignedInWithFabric(client.auth, fabricOptions);
setSession(result);
return result;
}, []);
const signOut = useCallback(async () => {
await client.auth.signOut();
}, []);
return {
session,
signIn,
signOut,
isAuthenticated: session?.isAuthenticated ?? false,
};
}
Verwenden Sie den Hook in Ihren Komponenten:
function App() {
const { isAuthenticated, signIn, signOut } = useFabricAuth();
if (!isAuthenticated) {
return <button onClick={signIn}>Sign in with Fabric</button>;
}
return (
<>
<Dashboard />
<button onClick={signOut}>Sign out</button>
</>
);
}
API-Referenz
ensureSignedInWithFabric
function ensureSignedInWithFabric(
auth: Auth,
options: FabricAuthOptions
): Promise<OpaqueSession>;
Implementiert einen Wasserfall mit vier Schritten für die Authentifizierung:
- Gibt die vorhandene Sitzung zurück, wenn sie bereits authentifiziert wurde.
- Versucht eine stille Aktualisierung über das Refresh-Token.
- Eingebetteter Modus – wenn die Ausführung innerhalb eines Fabric-IFrames erfolgt, wird die Sitzung über
postMessagevom übergeordneten Frame abgerufen. - Öffnet das Fabric-Portal in einem Popup (Popup-Ablauf) und wartet auf die
postMessage-Übergabe.
Die Schritte 1 bis 3 können beim Laden der Seite gefahrlos aufgerufen werden. Schritt 4 öffnet ein Popup und muss innerhalb eines Benutzergestenhandlers ausgeführt werden.
FabricAuthOptions
| Property | Typ | Description |
|---|---|---|
workspaceId |
string |
Die ID des Fabric-Arbeitsbereichs. |
projectId |
string |
Die Fabric App-Element-ID. |
fabricPortalUrl |
string |
Die Fabric Portalbasis-URL (z. B. https://app.fabric.microsoft.com). |
returnOrigin |
string |
Der Ursprung Ihrer App für die Bereitstellung von postMessage (z. B. window.location.origin). Muss ein barer Ursprung sein (Schema und Host, kein Pfad). |
fabricEmbedded |
boolean (wahlweise) |
Eingebetteten Modus erzwingen Automatisch aus ?fabricEmbedded=true in der URL erkannt. |
Hilfsfunktionen
| Funktion | Description |
|---|---|
initEmbeddedAuth(auth, options) |
Seitenladesichere eingebettete Authentifizierung. Gibt die Sitzung zurück, wenn sie in einem Fabric iframe ausgeführt wird, oder null andernfalls. |
initiateFabricLogin(auth, options) |
Popupfluss auf niedriger Ebene. Öffnet das Fabric-Portal in einem Popup mit PKCE-Parametern und wartet auf die postMessage Übergabe. |
isEmbeddedMode(options) |
Gibt true zurück, wenn die App im eingebetteten Modus ausgeführt wird (Fabric iframe). |
Sicherheitsfeatures
- PKCE S256 – Jeder Fluss generiert eine Kryptografiecodeüberprüfung und herausforderung, um die Abfangen von Autorisierungscode zu verhindern.
- State-Nonce – Eine zufällige Nonce verknüpft die Übergabeantwort mit der ursprünglichen Registerkarte und verhindert Cross-Site-Request-Forgery.
-
postMessageUrsprungsüberprüfung – Das SDK überprüftevent.origineingehende Nachrichten und lehnt Nachrichten von unerwarteten Ursprüngen ab. - Automatische Bereinigung – der PKCE-Zustand läuft nach 5 Minuten ab und wird beim nächsten Durchlauf bereinigt.
- Zeitüberschreitung des Ablaufs – Der Popup-Ablauf wird nach 5 Minuten beendet, wenn keine Übergabe-Nachricht empfangen wird.
Behandeln von Authentifizierungsproblemen
Popup wurde blockiert
Der Browser hat das Fabric Portalfenster blockiert. Stellen Sie sicher, dass ensureSignedInWithFabric() aus einem synchronen Handler für Benutzergesten aufgerufen wird (z. B. Schaltfläche onClick). Rufen Sie sie nicht beim Laden der Seite oder innerhalb einer asynchronen Kette vor der Benutzerinteraktion auf.
Sitzung wird nicht beibehalten
Bestätigen Sie, dass RayfinClient mit der richtigen baseUrl und publishableKey konfiguriert ist. Der Callback-Tab und der ursprüngliche Tab müssen denselben Ursprung haben, damit BroadcastChannel und localStorage funktionieren.
Die Authentifizierung schlägt nach langer Verzögerung fehl.
Der Anmeldeablauf läuft nach 5 Minuten ab. Wenn Sie den Anmeldevorgang starten, ihn aber nicht innerhalb dieses Zeitraums abschließen, schlägt der Ablauf fehl. Schließen Sie das Popup, und wählen Sie erneut die Anmeldeschaltfläche aus, um einen neuen Fluss zu starten.