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.
Organisationen können ihren Copilot Studio-Agents eine Sicherheitsebene hinzufügen, indem sie sie mit einem Laufzeit-Bedrohungserkennungssystem verbinden. Nach der Verbindung ruft der Agent dieses System zur Laufzeit auf. Der Agent stellt das System mit Daten bereit, damit das System ermitteln kann, ob ein Tool, das der Agent aufruft, legitim ist oder nicht. Das System antwortet dann auf Copilot Studio mit einer Antwort von "genehmigen" oder "Blockieren", wodurch der Agent das Tool aufruft oder entsprechend überspringt. Weitere Informationen zum Verbinden von Agents mit einem vorhandenen externen Bedrohungserkennungssystem finden Sie unter Enable external threat detection and protection for Copilot Studio custom agents.
Dieser Artikel richtet sich an Entwickler und beschreibt, wie Sie Ihre eigenen Bedrohungserkennungsfunktionen als Sicherheitsanbieter für Copilot Studio-Agents integrieren.
Die Integration basiert auf einer API, die aus zwei Endpunkten besteht. Der Hauptendpunkt, den Sie implementieren müssen, ist der analyze-tool-execution Endpunkt. Sie müssen diesen Endpunkt als Schnittstelle für Ihr Bedrohungserkennungssystem verfügbar machen. Sobald Kunden Ihr System als externes Bedrohungserkennungssystem konfigurieren, ruft der Agent diese API jedes Mal auf, wenn es ein Tool aufrufen möchte.
Neben dem analyze-tool-execution-Endpunkt müssen Sie auch einen zweiten Endpunkt mit dem Namen validate verfügbar machen. Der validate Endpunkt wird verwendet, um den Status und die Bereitschaft des Endpunkts im Rahmen der Systemeinrichtung zu überprüfen.
In den folgenden Abschnitten werden die einzelnen Endpunkte ausführlich beschrieben.
POST /validate
Zweck: Überprüft, ob der Endpunkt für die Bedrohungserkennung erreichbar und funktioniert. Wird für anfängliche Setup- und Konfigurationstests verwendet.
Überprüfen der Anforderung
Methode: POST
URL:
https://{threat detection endpoint}/validate?api-version=2025-05-01Kopfzeilen:
Autorisierung: Bearer-Token für die API-Authentifizierung
x-ms-correlation-id: GUID für die Ablaufverfolgung
Körper: Leer
Überprüfen der Antwort
200 OK-Antwortbeispiel
{
"isSuccessful": true,
"status": "OK"
}
Beispiel für Fehlerantwort
Wenn ein Fehler auftritt (nicht erfolgreicher HTTP-Code), gibt der Endpunkt einen Fehlercode, eine Meldung und optionale Diagnose zurück.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution - Ausführung des Analysewerkzeugs
Zweck: Sendet den Toolausführungskontext für die Risikobewertung. Wertet die Toolausführungsanforderung aus und antwortet, ob die Ausführung des Tools zugelassen oder blockiert werden soll.
Analyse-Tool-Ausführungsanforderung
Methode: POST
URL:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01Kopfzeilen:
- Autorisierung: Bearer-Token für die API-Authentifizierung
- Inhaltstyp: application/json
Körper: JSON-Objekt
Beispiel für Ausführung einer Analyse-Tool-Anforderung
POST https://security.contoso.com/api/agentSecurity/analyze-tool-execution?api-version=2025-05-01
Authorization: Bearer XXX……
x-ms-correlation-id: fbac57f1-3b19-4a2b-b69f-a1f2f2c5cc3c
Content-Type: application/json
{
"plannerContext": {
"userMessage": "Send an email to the customer",
"thought": "User wants to notify customer",
"chatHistory": [
{
"id": "m1",
"role": "user",
"content": "Send an email to the customer",
"timestamp": "2025-05-25T08:00:00Z"
},
{
"id": "m2",
"role": "assistant",
"content": "Which customer should I email?",
"timestamp": "2025-05-25T08:00:01Z"
},
{
"id": "m3",
"role": "user",
"content": "The customer is John Doe",
"timestamp": "2025-05-25T08:00:02Z"
}
],
"previousToolOutputs": [
{
"toolId": "tool-123",
"toolName": "Get customer email by name",
"outputs": {
"name": "email",
"description": "Customer's email address",
"type": {
"$kind": "String"
},
"value": "customer@foobar.com"
},
"timestamp": "2025-05-25T08:00:02Z"
}
]
},
"toolDefinition": {
"id": "tool-123",
"type": "PrebuiltToolDefinition",
"name": "Send email",
"description": "Sends an email to specified recipients.",
"inputParameters": [
{
"name": "to",
"description": "Receiver of the email",
"type": {
"$kind": "String"
}
},
{
"name": "bcc",
"description": "BCC of the email",
"type": {
"$kind": "String"
}
}
],
"outputParameters": [
{
"name": "result",
"description": "Result",
"type": {
"$kind": "String"
}
}
]
},
"inputValues": {
"to": "customer@foobar.com",
"bcc": "hacker@evil.com"
},
"conversationMetadata": {
"agent": {
"id": "agent-guid",
"tenantId": "tenant-guid",
"environmentId": "env-guid",
"isPublished": true
},
"user": {
"id": "user-guid",
"tenantId": "tenant-guid"
},
"trigger": {
"id": "trigger-guid",
"schemaName": "trigger-schema"
},
"conversationId": "conv-id",
"planId": "plan-guid",
"planStepId": "step-1"
}
}
Antwort auf die Ausführung des Analysetools
200 OK (Anforderung erfolgreich)
Wenn die Anforderung gültig ist, wird die in der Anforderung angegebene Toolverwendung basierend auf den definierten Kriterien ausgewertet und entweder zugelassen oder blockiert. Die Antwort kann die folgenden Felder enthalten:
- blockAction (Boolean): Gibt an, ob die Aktion blockiert werden soll.
- reasonCode (ganze Zahl, optional): Numerischer Code, der den Grund für den Block erklärt
- Grund (Zeichenfolge, optional): Menschlich lesbare Erklärung
- Diagnose (Objekt, optional): Weitere Details zur Ablaufverfolgung oder zum Debuggen
Beispiel für antwort zulassen
{
"blockAction": false
}
Beispiel für eine Blockantwort
{
"blockAction": true,
"reasonCode": 112,
"reason": "The action was blocked because there is a noncompliant email address in the BCC field.",
"diagnostics": "{\\flaggedField\\:\\bcc\\,\\flaggedValue\\:\\hacker@evil.com\\}"
}
Beispielfehlerantwort
Wenn die Anforderung ungültig ist, wird eine Fehlerantwort mit einem Fehlercode, einer Nachricht, einem HTTP-Status und einer optionalen Diagnose zurückgegeben.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Referenz zu Anforderungs- und Antwortkörperstrukturen
In den folgenden Tabellen werden die Inhalte verschiedener Objekte beschrieben, die in den Anforderungs- und Antworttexten für die Endpunkte verwendet werden.
Validierungsantwort
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| istErfolgreich | Boolean | Yes | Gibt an, ob die Überprüfung bestanden wurde. |
| status | Schnur | Yes | Optionale Statusmeldung oder partnerspezifische Details. |
AnalyzeToolExecutionResponse
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| blockAction | Boolean | Yes | Gibt an, ob die Aktion blockiert werden soll. |
| Gründen-Code | Integer | Nein | Optionaler numerischer Grundcode, der vom Partner bestimmt wird. |
| Grund | Schnur | Nein | Optionale, vom Menschen lesbare Erklärung. |
| diagnostics | Schnur | Nein | Optionale Diagnoseinformationen in freier Form für Debugging oder Telemetrie. Muss vorserialisiert werden. |
Fehlerantwort
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| Fehlercode | Integer | Yes | Numerischer Bezeichner für den Fehler (z. B. 1001 = fehlendes Feld, 2003 = Authentifizierungsfehler). |
| message | Schnur | Yes | Die vom Menschen lesbare Erklärung des Fehlers. |
| httpStatus (Englisch) | Integer | Yes | HTTP-Statuscode, der vom Partner zurückgegeben wird. |
| diagnostics | Schnur | Nein | Optionale Diagnoseinformationen in freier Form für Debugging oder Telemetrie. Muss vorserialisiert werden. |
Evaluierungsanfrage
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| plannerContext | PlannerContext | Yes | Planner-Kontextdaten. |
| Werkzeugdefinition | ToolDefinition | Yes | Details zur Tooldefinition. |
| Eingabewerte | JSON-Objekt | Yes | Wörterbuch der Schlüsselwertpaare, die für das Tool bereitgestellt werden. |
| Konversationsmetadaten | ConversationMetadata | Yes | Metadaten zum Unterhaltungskontext, zum Benutzer und zum Planen der Nachverfolgung. |
PlannerContext
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| Benutzernachricht | Schnur | Yes | Die ursprüngliche Nachricht, die vom Agent gesendet wurde. |
| Gedanke | Schnur | Nein | Planner-Erklärung, warum dieses Tool ausgewählt wurde. |
| chatHistory | ChatMessage[] | Nein | Liste der zuletzt ausgetauschten Chatnachrichten mit dem Benutzer. |
| vorherigeWerkzeugeAusgaben | ToolExecutionOutput[] | Nein | Liste der neuesten Toolausgaben. |
Chatnachricht
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Schnur | Yes | Eindeutiger Bezeichner für diese Mitteilung innerhalb der Unterhaltung. |
| role | Schnur | Yes | Quelle der Nachricht (z. B. Benutzer, Assistent). |
| Inhalt | Schnur | Yes | Der Nachrichtentext. |
| Zeitstempel | Zeichenfolge (Datum-Uhrzeit) | Nein | ISO 8601-Zeitstempel, der angibt, wann die Nachricht gesendet wurde. |
Werkzeugausführungsausgaben
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| toolId | Schnur | Yes | Eindeutiger Bezeichner für diese Mitteilung innerhalb der Unterhaltung. |
| toolName | Schnur | Yes | Name des Tools. |
| Ergebnisse | ExecutionOutput[] | Yes | Liste der Werkzeugausführungsergebnisse. |
| Zeitstempel | Zeichenfolge (Datum-Uhrzeit) | Nein | ISO 8601-Zeitstempel, der angibt, wann die Toolausführung abgeschlossen wurde. |
ExecutionOutput
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| name | Schnur | Yes | Name des Ausgabeparameters. |
| Beschreibung | Schnur | Nein | Erläuterung für den Ausgabewert. |
| type | Objekt | Nein | Datentyp der Ausgabe. |
| value | JSON-Datenwert | Yes | Der Ausgabewert. |
Werkzeugdefinition
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Schnur | Yes | Eindeutiger Bezeichner des Tools. |
| type | Schnur | Yes | Gibt die Art des Tools an, das im Planner verwendet wird. |
| name | Schnur | Yes | Lesbarer Name des Tools. |
| Beschreibung | Schnur | Yes | Zusammenfassung der Funktionsweise des Tools. |
| Eingabeparameter | ToolInput[] | Nein | Eingabeparameter des Tools. |
| Ausgabeparameter | ToolOutput[] | Nein | Ausgabeparameter, die das Tool nach der Ausführung zurückgibt. |
Werkzeugeingabe
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| name | Schnur | Yes | Name des Eingabeparameters. |
| Beschreibung | Schnur | Nein | Erläuterung des erwarteten Werts für diesen Eingabeparameter. |
| type | JSON-Objekt | Nein | Datentyp des Eingabeparameters. |
Werkzeugausgabe
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| name | Schnur | Yes | Name des Ausgabeparameters. |
| Beschreibung | Schnur | Nein | Erläuterung des Ausgabewerts. |
| type | JSON-Objekt | Nein | Typ des Ausgabewerts. |
ConversationMetadata
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| Agent | AgentContext | Yes | Agentkontextinformationen. |
| user | UserContext | Nein | Informationen zum Benutzer, der mit dem Agent interagiert. |
| trigger | TriggerContext | Nein | Informationen dazu, was die Planner-Ausführung ausgelöst hat. |
| conversationId | Schnur | Yes | ID des laufenden Gesprächs. |
| planId | Schnur | Nein | ID des Plans, der zur Erfüllung der Benutzeranforderung verwendet wird. |
| planStepId | Schnur | Nein | Schritt innerhalb des Plans, der der Ausführung dieses Werkzeugs entspricht. |
| parentAgentComponentId | Schnur | Nein | ID der übergeordneten Agentkomponente. |
AgentContext
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Schnur | Yes | ID des Agents. |
| tenantId | Schnur | Yes | Mandant, in dem sich der Agent befindet. |
| environmentId | Schnur | Yes | Umgebung, in der der Agent veröffentlicht wird. |
| Ausgabe | Schnur | Nein | Agentversion (optional, falls isPublished falsch ist). |
| veröffentlicht | Boolean | Yes | Gibt an, ob dieser Ausführungskontext eine veröffentlichte Version ist. |
UserContext
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Schnur | Nein | Microsoft Entra Objekt-ID des Benutzers. |
| tenantId | Schnur | Nein | Mandanten-ID des Benutzers. |
Auslöserkontext
| Name | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Schnur | Nein | Die ID des Triggers, der den Planner ausgelöst hat. |
| schemaName | Schnur | Nein | Der Name des Triggerschemas, das den Planner ausgelöst hat. |
Authentifizierung
Die von Ihnen entwickelte Integration sollte Microsoft Entra ID Authentifizierung verwenden. Befolgen Sie die Anweisungen zum Integrieren von Apps, die Ihre Entwickler erstellen.
Schritte, die sie ausführen müssen, umfassen Folgendes:
- Erstellen Sie eine App-Registrierung für Ihre Ressource in Ihrem Mandanten.
-
Machen Sie einen Bereich für Ihre Web-API verfügbar. Der verfügbar gemachte Bereich muss die Basis-URL für die Ressource sein, die der Kunden aufruft. Wenn die API-URL beispielsweise lautet
https://security.contoso.com/api/threatdetection, musshttps://security.contoso.comder verfügbar gemachte Bereich sein. - Je nachdem, wie Sie Ihren Dienst implementieren, müssen Sie Autorisierungslogik implementieren und eingehende Token überprüfen. Sie müssen dokumentieren, wie der Kunde seine Apps autorisieren muss. Es gibt mehrere Möglichkeiten, dies zu tun, zum Beispiel durch eine Erlaubnisliste von App-IDs oder rollenbasierte Zugriffskontrolle (RBAC).
Antwortzeitanforderungen
Der Agent erwartet eine Antwort vom Bedrohungserkennungssystem innerhalb von weniger als 1.000 ms. Sie sollten sicherstellen, dass Ihr Endpunkt innerhalb dieses Zeitrahmens auf den Anruf antwortet. Wenn Ihr System nicht rechtzeitig reagiert, verhält sich der Agent so, als ob Ihre Antwort "zulassen" ist und das Tool aufruft.
API-Versionsverwaltung
In Anforderungen wird die API-Version über einen api-version Abfrageparameter angegeben (z. B api-version=2025-05-01. ). Ihre Implementierung sollte gegenüber anderen unerwarteten Feldern tolerant sein und sollte nicht fehlschlagen, wenn in Zukunft neue Werte hinzugefügt werden. Partner sollten die API-Version nicht überprüfen, da derzeit alle Versionen als nicht unterbrechend betrachtet werden. Partner sollten die API-Versionen nachverfolgen, die Anfrage jedoch nicht fehlschlagen lassen, wenn eine neue Version verfügbar ist.