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-Agent eine zusätzliche Schutzebene hinzufügen, indem sie diese mit einem Bedrohungserkennungssystem zur Laufzeit verbinden. Sobald die Verbindung hergestellt ist, ruft der Agent dieses System zur Laufzeit auf. Der Agent übermittelt dem System Daten, damit dieses feststellen kann, ob ein Tool, das der Agent ausführen möchte, legitim ist oder nicht. Das System antwortet dann auf Copilot Studio mit einer Genehmigen- oder Sperren-Antwort, wodurch der Agent das Tool entsprechend aufruft bzw. überspringt. Weitere Informationen darüber, wie Sie Agents mit einem bestehenden externen Bedrohungserkennungssystem verbinden, finden Sie unter Externe Bedrohungserkennung und Schutz für Copilot Studio benutzerdefinierte Agents aktivieren.
Dieser Artikel richtet sich an Entwickler und beschreibt, wie Sie Ihre eigenen Bedrohungserkennungsfunktionen als Sicherheitsanbieter für Copilot Studio-Agents integrieren können.
Die Integration basiert auf einer API mit zwei Endpunkten. Der wichtigste Endpunkt, den Sie implementieren müssen, ist der analyze-tool-execution Endpunkt. Sie müssen diesen Endpunkt als Schnittstelle zu Ihrem Bedrohungserkennungssystem bereitstellen. Sobald Kunden Ihr System als externes Bedrohungserkennungssystem eingerichtet haben, ruft der Agent diese API bei jedem geplanten Toolaufruf auf.
Neben dem analyze-tool-execution-Endpunkt müssen Sie auch einen zweiten Endpunkt bereitstellen, der validate genannt wird. Der validate-Endpunkt wird verwendet, um die Gesundheit und Funktionsfähigkeit des Endpunkts im Rahmen der Systemeinrichtung zu überprüfen.
Die folgenden Abschnitte beschreiben jeden Endpunkt detailliert.
POST /validate
Zweck: Überprüft, ob der Bedrohungserkennungsendpunkt erreichbar und funktionsfähig ist. Verwendet für die Ersteinrichtung und Konfigurationstests.
Anforderung validieren
Methode: POST
URL:
https://{threat detection endpoint}/validate?api-version=2025-05-01Headers:
Autorisierung: Bearer-Token für API-Authentifizierung
x-ms-correlation-id: GUID zur Nachverfolgung
Text: Leer
Antworten validieren
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 Nachricht und optionale Diagnoseinformationen zurück.
{
"errorCode": 5031,
"message": "Validation failed. Webhook service is temporarily unavailable.",
"httpStatus": 503,
"diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}
POST /analyze-tool-execution
Zweck: Sendet den Kontext der Tool-Ausführung zur Risikobewertung. Bewertet die Tool-Ausführungsanfrage und entscheidet, ob die Tool-Ausführung erlaubt oder blockiert wird.
Tool-Ausführungsanforderung analysieren
Methode: POST
URL:
https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01Headers:
- Autorisierung: Bearer-Token für API-Authentifizierung
- Inhaltstyp: application/json
Body: JSON Objekt
Beispiel für eine Analysieren-Tool-Ausführungsanfrage
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"
}
}
Analysieren-Tool-Ausführungsantwort
200 OK
Wenn die Anfrage gültig ist, wird die in der Anfrage angegebene Toolnutzung bewertet und entweder erlaubt oder blockiert, basierend auf den definierten Kriterien. Die Antwort kann die folgenden Felder enthalten:
- blockAction (boolesch): Ob die Aktion blockiert werden sollte
- reasonCode (integer, optional): Numerischer Code, der den Grund für die Blockierung erklärt
- reason (String, optional): Menschenlesbare Erklärung
- diagnostics (object, optional): Weitere Details zum Nachverfolgen oder Debuggen
Beispiel für Antwort zulassen
{
"blockAction": false
}
Beispiel für 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\\}"
}
Beispiel für Fehlerantwort
Falls die Anfrage ungültig ist, wird eine Fehlerantwort mit einem Fehlercode, einer Nachricht, einem HTTP-Status und optionalen Diagnoseinformationen zurückgegeben.
{
"errorCode": 4001,
"message": "Missing required field: toolDefinition",
"httpStatus": 400,
"diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}
Referenz zu Anforderungs- und Antworttextstrukturen
Die folgenden Tabellen beschreiben die Inhalte verschiedener Objekte, die in den Anfrage- und Antwortkörpern der Endpunkte verwendet werden.
ValidationResponse
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| isSuccessful | Boolesch | Ja | Gibt an, ob die Validierung erfolgreich war. |
| status | string | Ja | Optionale Statusnachricht oder partnerspezifisches Detail. |
AnalyzeToolExecutionResponse
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| blockAction | Boolesch | Ja | Gibt an, ob die Aktion blockiert werden soll. |
| reasonCode | Integer | Nein | Optionaler numerischer Grundcode, der vom Partner bestimmt wird. |
| reason | Zeichenfolge | Nein | Optionale, für Menschen verständliche Erklärung. |
| diagnostics | string | Nein | Optionale frei gestaltete Diagnoseinformationen für Debugging oder Telemetrie. Muss vorab serialisiert werden. |
ErrorResponse
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| errorCode | Integer | Ja | Numerische Kennung für den Fehler (zum Beispiel 1001 = fehlendes Feld, 2003 = Authentifizierungsfehler). |
| Nachricht | string | Ja | Für Menschen verständliche Erklärung des Fehlers. |
| httpStatus | Integer | Ja | HTTP-Statuscode, der vom Partner zurückgegeben wird. |
| diagnostics | string | Nein | Optionale frei gestaltete Diagnoseinformationen für Debugging oder Telemetrie. Muss vorab serialisiert werden. |
EvaluationRequest
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| plannerContext | PlannerContext | Ja | Planer-Kontextdaten. |
| toolDefinition | ToolDefinition | Ja | Details zur Definition des Tools. |
| inputValues | JSON-Objekt | Ja | Dictionary mit Schlüssel-Wert-Paaren, das dem Tool bereitgestellt wird. |
| conversationMetadata | ConversationMetadata | Ja | Metadaten über den Unterhaltungskontext, den Nutzer und die Planverfolgung. |
PlannerContext
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| userMessage | string | Ja | Die ursprüngliche Nachricht des Agent. |
| Gedanken | string | Nein | Erläuterung des Planners, warum dieses Tool ausgewählt wurde |
| chatHistory | ChatMessage[] | Nein | Liste der kürzlich ausgetauschten Chatnachrichten mit dem Nutzer. |
| previousToolsOutputs | ToolExecutionOutput[] | Nein | Liste der letzten Toolausgaben. |
ChatMessage
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Zeichenfolge | Ja | Eindeutige Kennung für diese Nachricht in der Unterhaltung. |
| role | string | Ja | Quelle der Nachricht (z. B. Benutzer, Assistent). |
| Inhalt | string | Ja | Der Nachrichtentext. |
| timestamp | string (Datum/Uhrzeit) | Nein | ISO 8601 Zeitstempel, der angibt, wann die Nachricht gesendet wurde. |
ToolExecutionOutputs
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| toolId | string | Ja | Eindeutige Kennung für diese Nachricht in der Unterhaltung. |
| toolName | string | Ja | Name des Tools. |
| gibt aus | ExecutionOutput[] | Ja | Liste der Toolausführungsausgaben. |
| timestamp | string (Datum/Uhrzeit) | Nein | ISO 8601 Zeitstempel, der angibt, wann die Ausführung des Tools abgeschlossen wurde. |
ExecutionOutput
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| Name | Zeichenfolge | Ja | Name des Ausgabeparameters. |
| Beschreibung | Zeichenfolge | Nein | Erklärung des Ausgabewerts. |
| Typ | object | Nein | Datentyp der Ausgabe. |
| value | JSON Datenwert | Ja | Der Ausgabewert. |
ToolDefinition
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Zeichenfolge | Ja | Eindeutiger Bezeichner des Tools. |
| Typ | string | Ja | Gibt die Art des im Planner verwendeten Tools an. |
| Name | Zeichenfolge | Ja | Menschlich lesbarer Name des Tools. |
| Beschreibung | Zeichenfolge | Ja | Zusammenfassung der Funktionen des Tools |
| inputParameters | ToolInput[] | Nein | Eingabeparameter des Tools. |
| outputParameters | ToolOutput[] | Nein | Ausgabeparameter, die das Tool nach der Ausführung zurückgibt. |
ToolInput
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| Name | Zeichenfolge | Ja | Name des Eingabeparameters. |
| Beschreibung | Zeichenfolge | Nein | Erklärung des erwarteten Werts für diesen Eingabeparameter. |
| Typ | JSON-Objekt | Nein | Datentyp des Eingabeparameters. |
ToolOutput
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| Name | Zeichenfolge | Ja | Name des Ausgabeparameters. |
| Beschreibung | Zeichenfolge | Nein | Erklärung des Ausgabewerts. |
| Typ | JSON-Objekt | Nein | Der Typ des Ausgabewerts. |
ConversationMetadata
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| Agent | AgentContext | Ja | Agentkontextinformation. |
| -Benutzer | UserContext | Nein | Informationen über den Nutzer, der mit dem Agent interagiert. |
| Trigger (trigger) | TriggerContext | Nein | Informationen dazu, was die Planner-Ausführung ausgelöst hat. |
| conversationId | string | Ja | ID der laufenden Unterhaltung. |
| planId | string | Nein | ID des Plans, der zur Erfüllung der Nutzeranfrage verwendet wird. |
| planStepId | string | Nein | Schritt innerhalb des Plans, der dieser Tool-Ausführung entspricht. |
| parentAgentComponentId | string | Nein | ID der übergeordneten Agent-Komponente. |
AgentContext
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Zeichenfolge | Ja | Die ID des Agents. |
| tenantId | string | Ja | Mandant, in dem sich der Agent befindet. |
| environmentId | string | Ja | Umgebung, in der der Agent veröffentlicht wird. |
| version | string | Nein | Agent-Version (optional, wenn isPublished falsch). |
| isPublished | Boolesch | Ja | Gibt an, ob dieser Ausführungskontext eine veröffentlichte Version ist. |
UserContext
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Zeichenfolge | Nein | Microsoft Entra-Objekt-ID des Benutzers. |
| tenantId | string | Nein | Mandanten-ID des Benutzers. |
TriggerContext
| Name | Type | Erforderlich | Beschreibung |
|---|---|---|---|
| id | Zeichenfolge | Nein | Die ID des Auslösers, der den Planner ausgelöst hat. |
| schemaName | string | Nein | Der Name des Trigger-Schemas, das den Planner ausgelöst hat. |
Authentifizierung
Die von Ihnen entwickelte Integration sollte die Microsoft Entra ID-Authentifizierung verwenden. Befolgen Sie die Anweisungen zu Integrieren von Apps, die Ihre Entwickler erstellen.
Durchzuführende Schritte, einschließlich der Folgenden:
- Erstellen einer App-Registrierung für Ihre Ressource in Ihrem Mandanten.
-
Verfügbarmachen eines Umfangs für Ihre Web-API. Der verfügbar gemachte Bereich muss die Basis-URL für die Ressource sein, die Kunden aufrufen. Wenn die API-URL beispielsweise
https://security.contoso.com/api/threatdetectionlautet, muss der verfügbar gemachte Umfanghttps://security.contoso.comsein. - Je nachdem, wie Sie Ihren Service implementieren, müssen Sie die Autorisierungslogik implementieren und eingehende Token validieren. Sie müssen dokumentieren, wie der Kunde seine Apps autorisieren muss. Es gibt mehrere Möglichkeiten, dies zu tun, zum Beispiel durch die Verwendung einer Zulassen-Liste von App-IDs oder rollenbasierte Zugriffskontrolle (RBAC).
Antwortzeitanforderungen
Der Agent erwartet innerhalb von weniger als 1.000 ms eine Antwort vom Bedrohungserkennungssystem. Stellen Sie sicher, dass Ihr Endpunkt innerhalb dieses Zeitrahmens auf die Anfrage antwortet. Wenn Ihr System nicht rechtzeitig antwortet, verhält sich der Agent so, als wäre die Antwort „zulassen“ und führt das Tool aus.
API-Versionsverwaltung
In Anfragen wird die API-Version mittels eines api-version-Abfrageparameters (z. B. api-version=2025-05-01) angegeben. Ihre Implementierung sollte tolerant gegenüber anderen unerwarteten Feldern sein und 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 verfolgen, aber die Anfrage nicht fehlschlagen lassen, wenn eine neue Version erkannt wird.