Notă
Accesul la această pagină necesită autorizare. Puteți încerca să vă conectați sau să modificați directoarele.
Accesul la această pagină necesită autorizare. Puteți încerca să modificați directoarele.
Politica de Securitate a Conținutului (CSP) este în prezent suportată în aplicațiile bazate pe modele, canvas și cod. Acest articol explică cum să configurezi CSP pentru aplicații bazate pe modele și canvas. Pentru aplicații de cod CSP, consultați documentația aplicațiilor de cod. Administratorii pot controla dacă antetul CSP este trimis și, într-o anumită măsură, ce conține. Setările sunt la nivel de mediu, ceea ce înseamnă că se aplică tuturor aplicațiilor din mediu odată ce sunt activate.
Notă
Politica de securitate a conținutului se aplică numai mediilor care utilizează Dataverse.
Fiecare componentă a valorii antetului CSP controlează activele care pot fi descărcate. Mozilla Developer Network (MDN) oferă descrieri mai detaliate. Valorile implicite sunt prezentate mai jos:
| Directivă | Valoare implicită | Particularizabile |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: |
Nu |
| sursă-lucrător | 'self' blob: |
Nu |
| sursă-de-stil | * 'unsafe-inline' blob: |
Nu |
| font-src | * data: |
Nu |
| strămoși ai cadrului | 'self' https://*.powerapps.com |
Da |
Această configurație are ca rezultat un CSP implicit de script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.
Mod strict
Comutatorul Strict CSP creează un CSP care, în mare parte, nu include wildcard-uri sau directive nesigure, cum ar fi unsafe-inline. Când activezi Strict CSP, directivele anterioare devin următoarele directive detaliate în această secțiune. Notația <platform> înseamnă că domeniile platformei sunt furnizate conform cerințelor produsului. Domeniile din această secțiune se pot schimba în timp pe măsură ce produsul crește.
| Directivă | Valoare implicită (bazată pe model) | Valoare implicită (pânză) | Particularizabile |
|---|---|---|---|
| script-src | 'self' blob: <platform>' |
'self' <platform>' |
Da |
| sursă-lucrător | 'self' blob: |
'self' blob: |
Nu |
| sursă-de-stil | 'self' 'unsafe-inline' blob: <platform> |
'self' 'unsafe-inline' <platform> |
Da |
| font-src | 'self' data: <platform> |
'self' data: <platform> |
Da |
| strămoși ai cadrului | 'self' https://*.powerapps.com |
'self' https://*.powerapps.com |
Da |
| img-src | 'self' blob: data: <platform> |
'self' data: <platform> |
Da |
| conectare-src | 'self' blob: data: wss: <platform> |
'self' blob: <platform> |
Da |
| cadru-src | 'self' blob: <platform> |
'self' <platform> |
Da |
| baza-uri | 'none' |
Indisponibil | Nu |
| forma-acțiune | <platform> |
Indisponibil | Da |
| implicit-src | 'self' |
'self' |
Nu |
Cerințe preliminare
Pentru aplicațiile de implicare a clienților Dynamics 365 și alte aplicații bazate pe modele, CSP este disponibil doar în medii online și în organizații cu Dynamics 365 customer engagement (on-premises), versiunea 9.1 sau versiune ulterioară.
Configurați CSP
Puteți comuta și configura CSP prin intermediul centrului de administrare. Power Platform Este important să activați mai întâi un mediu de dezvoltare/testare, deoarece activarea CSP ar putea bloca scenarii dacă politica este încălcată. Centrul de administrare suportă, de asemenea, un mod doar cu raport pentru a permite o creștere mai ușoară a producției.
Urmează acești pași pentru a configura CSP:
- Conectați-vă la Centrul de administrare Power Platform.
- În panoul de navigare, selectați Gestionare. În panoul Gestionare , selectați Medii.
- Pe pagina Medii , selectați un mediu.
- În bara de comenzi, selectați Setări.
- Extindeți Produs, apoi selectați Confidențialitate + Securitate.
Următoarea imagine prezintă starea implicită a setărilor:
Raportare
Comutatorul *Activare raportare* controlează dacă aplicațiile bazate pe model și cele de tip pânză trimit rapoarte de încălcare. Pentru a-l activa, specifică un punct final. Aplicația trimite rapoarte de încălcare către acest endpoint, indiferent dacă CSP este aplicat sau nu. Dacă CSP nu este aplicat, aplicația folosește modul doar raport. Pentru mai multe informaţii, consultaţi documentația de raportare.
Impunere
Punerea în aplicare a CSP este controlată independent pentru aplicațiile bazate pe model și pentru aplicațiile create pe planșă, pentru a oferi control granular asupra politicilor. Utilizați pivotul bazat pe model/planșă pentru a modifica tipul de aplicație dorit.
Comutatorul Impune politica de securitate a conținutului activează politica implicită pentru aplicare pentru tipul de aplicație dat. Activarea acestei opțiuni modifică comportamentul aplicațiilor din acest mediu pentru a respecta politica. Prin urmare, urmează acest flux sugerat de activare:
- Aplică politica într-un mediu de dezvoltare sau testare.
- Activați modul numai pentru rapoarte în producție.
- Aplică politica în producție imediat ce nu sunt raportate încălcări.
Configurare directive
Secțiunea Configurare directive vă permite să controlați directivele individuale din cadrul politicii. În prezent, poți personaliza doar directiva frame-ancestors .
Dacă lași directiva implicită activată, folosești valoarea implicită specificată în tabel. Dacă dezactivezi comutatorul, poți specifica valori personalizate pentru directiva și să le adaugi la valoarea implicită. Următorul exemplu stabilește valori personalizate pentru frame-ancestors. Directiva este setată pe frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com în acest exemplu. Această setare înseamnă că aplicația poate fi găzduită în aceeași origine, https://*.powerapps.com, https://www.foo.com, și https://www.bar.com, dar nu și în alte origini. Folosiți butonul Adăugare pentru a adăuga intrări în listă și pictograma Ștergere pentru a le elimina.
Configurații comune
Pentru integrarea Microsoft Teams folosind aplicația Dynamics 365, adăugați următoarele la frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Pentru aplicația Dynamics 365 pentru Outlook, adăugați următoarele la frame-ancestors:
- Originea paginii principale a aplicației web Outlook
https://outlook.office.comhttps://outlook.office365.com
Pentru integrarea Power Apps în rapoartele Power BI, adăugați următoarele la frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Considerații importante
Dezactivarea directivei implicite și salvarea cu o listă goală dezactivează complet directiva și nu o trimite ca parte a antetului de răspuns CSP.
Exemple de configurare CSP
Iată câteva exemple de configurații CSP.
Exemplul 1 - raportarea este dezactivată
În exemplu:
- Raportarea este dezactivată.
- Aplicarea bazată pe model este activată.
-
frame-ancestorseste personalizat pentruhttps://www.contoso.comșihttps://www.fabrikam.com.
-
- Aplicarea planșei este dezactivată.
Anteturile eficiente sunt:
- Aplicații proiectate pe bază de model:
Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline' :blob; font-src * data:; frame-ancestors https://www.contoso.com https://www.fabrikam.com; - Aplicații Canvas: antetul CSP nu este trimis.
Exemplul 2 - raportarea este activată
În exemplu:
- Raportarea este activată.
- Punctul final de raportare este setat la
https://contoso.com/reporting-endpoint
- Punctul final de raportare este setat la
- Aplicarea bazată pe model este activată.
-
frame-ancestorseste păstrat ca implicit
-
- Aplicarea planșei este dezactivată.
-
frame-ancestorseste personalizat pentruhttps://www.contoso.com
-
Valorile CSP efective sunt:
- Aplicații proiectate pe bază de model:
Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://contoso.com/reporting-endpoint; - Aplicații create pe planșă:
Content-Security-Policy-Report-Only: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors https://www.contoso.com; report-uri https://contoso.com/reporting-endpoint;
Modificați direct setările organizației
Puteți configura CSP fără a utiliza interfața cu utilizatorul, modificând direct aceste setări ale organizației:
IsContentSecurityPolicyEnabled controlează dacă antetul Content-Security-Policy este trimis în aplicațiile bazate pe model.
ContentSecurityPolicyConfiguration controlează valoarea porțiunii frame-ancestors (așa cum s-a văzut mai devreme, se setează la
'self'dacăContentSecurityPolicyConfigurationnu este setat). Definiți această setare folosind un obiect JSON cu următoarea structură –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Această configurație se traduce prinscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';- (De la MDN) Directiva HTTP Content-Security-Policy (CSP) frame-ancestors specifică părinții valizi care pot încorpora o pagină folosind
<frame>,<iframe>,<object>,<embed>, sau<applet>.
- (De la MDN) Directiva HTTP Content-Security-Policy (CSP) frame-ancestors specifică părinții valizi care pot încorpora o pagină folosind
IsContentSecurityPolicyEnabledForCanvas controlează dacă antetul Content-Security-Policy este trimis în aplicațiile canvas.
ContentSecurityPolicyConfigurationForCanvas controlează politica pentru canvas folosind același proces descris în
ContentSecurityPolicyConfiguration.ContentSecurityPolicyReportUri controlează dacă raportarea ar trebui utilizată. Această setare este utilizată atât de aplicațiile bazate pe model, cât și de aplicațiile create pe planșă. Un șir valid trimite rapoarte de încălcare către endpoint-ul specificat, utilizând modul doar raportare dacă
IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvaseste dezactivat. Un șir gol dezactivează raportarea. Pentru mai multe informaţii, consultaţi documentația de raportare.
Configurarea CSP fără interfața de utilizare
În special pentru mediile care nu se află în centrul de administrare Power Platform, cum ar fi configurațiile locale, este posibil ca administratorii să dorească să configureze CSP folosind scripturi pentru a modifica direct setările.
Activează CSP fără interfață utilizator
Urmați acești pași pentru a activa CSP fără interfață utilizator:
- Deschideți instrumentele de dezvoltare din browser în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administrator de sistem este o opțiune bună).
- Lipiți și executați următorul script în consolă.
- Pentru a activa CSP, transmiteți configurația implicită -
enableFrameAncestors(["'self'"]) - Ca exemplu de permitere a încorporării aplicației de către alte origini -
enableFrameAncestors(["*.powerapps.com", "'self'", "abcxyz"])
async function enableFrameAncestors(sources) {
const baseUrl = Xrm.Utility.getGlobalContext().getClientUrl();
if (!Array.isArray(sources) || sources.some(s => typeof s !== 'string')) {
throw new Error('sources must be a string array');
}
const orgResponse = await fetch(`${baseUrl}/api/data/v9.1/organizations`);
if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
const orgs = await orgResponse.json();
const { organizationid, contentsecuritypolicyconfiguration, iscontentsecuritypolicyenabled } = orgs.value[0];
console.log(`Organization Id: ${organizationid}`);
console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);
console.log(`CSP Config: ${contentsecuritypolicyconfiguration}`);
const orgProperty = prop => `${baseUrl}/api/data/v9.1/organizations(${organizationid})/${prop}`;
console.log('Updating CSP configuration...')
const config = {
'Frame-Ancestor': {
sources: sources.map(source => ({ source })),
},
};
const cspConfigResponse = await fetch(orgProperty('contentsecuritypolicyconfiguration'), {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
value: JSON.stringify(config),
}),
});
if (!cspConfigResponse.ok) {
throw new Error('Failed to update csp configuration');
}
console.log('Successfully updated CSP configuration!')
if (iscontentsecuritypolicyenabled) {
console.log('CSP is already enabled! Skipping update.')
return;
}
console.log('Enabling CSP...')
const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
value: true,
}),
});
if (!cspEnableResponse.ok) {
throw new Error('Failed to enable csp');
}
console.log('Successfully enabled CSP!')
}
Dezactivați CSP fără interfață utilizator
Urmați acești pași pentru a dezactiva CSP fără interfață utilizator:
- Deschideți instrumentele de dezvoltare din browser în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administrator de sistem este o opțiune bună).
- Lipiți și executați următorul script în consolă.
- Pentru a dezactiva CSP, inserați în consolă:
disableCSP()
async function disableCSP() {
const baseUrl = Xrm.Utility.getGlobalContext().getClientUrl();
const orgResponse = await fetch(`${baseUrl}/api/data/v9.1/organizations`);
if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
const orgs = await orgResponse.json();
const { organizationid, iscontentsecuritypolicyenabled } = orgs.value[0];
console.log(`Organization Id: ${organizationid}`);
console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);
const orgProperty = prop => `${baseUrl}/api/data/v9.1/organizations(${organizationid})/${prop}`;
if (!iscontentsecuritypolicyenabled) {
console.log('CSP is already disabled! Skipping update.')
return;
}
console.log('Disabling CSP...')
const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
value: false,
}),
});
if (!cspEnableResponse.ok) {
throw new Error('Failed to disable csp');
}
console.log('Successfully disabled CSP!')
}