Заголовок Application Insights удалил параметры cfg на стороне клиента

#asp.net #azure-application-insights

Вопрос:

Я использую информацию о приложениях от Microsoft Azure в ASP.NET Веб-формы. Я создал прокси-сервер для перенаправления запросов на стороне клиента, чтобы защитить ключ API. Это прекрасно работало в коротком примере, который я создал. Однако, когда я попытался интегрироваться на веб-сайте моей компании, был добавлен заголовок, который защищал другие веб-сайты от использования API. Код для добавления заголовка выглядит следующим образом:

 var csrfToken = "<%:TokenHeaderValue()%>";
        $(document).ajaxSend(function (ev, jqXHR, settings) {
            if (!settings.url.startsWith("http://127.0.0.1:<%= SGCBusiness.Configuration.AgentManagerPort%>") || IsUserAgentMacOS()) {
                if (settings.url.startsWith("http://127.0.0.1")) {
                    // add userauth token header
                    jqXHR.setRequestHeader('Authorization', 'Bearer '   getUserAuthToken());
                    if (settings.url.indexOf("?") != -1) {
                        settings.url = settings.url   "amp;RequestVerificationToken="   csrfToken;
                    } else {
                        settings.url = settings.url   "?RequestVerificationToken="   csrfToken;
                    }
                } else {
                    jqXHR.setRequestHeader('RequestVerificationToken', csrfToken);
                }
            }
        });
 

Все запросы на стороне клиента получают значение Requestverification, но сценарий ApplicationInsights не получает этот заголовок. Я попытался сконфигурировать объект cfg json, добавив в заголовки разрешений доступа параметр RequestVerificationToken и даже определив значение параметра RequestVerificationToken в cfg json.
Моя попытка может быть визуализирована здесь, пожалуйста, обратите внимание на конфигурацию объекта cfg json и мою попытку в первой строке скрипта определить csrfToken, а затем установить токен в заголовке:

 <script type="text/javascript">
        !function (T, l, y) { var S = T.location, csrfToken = "<%:TokenHeaderValue()%>", k = "script", D = "instrumentationKey", C = "ingestionendpoint", I = "disableExceptionTracking", E = "ai.device.", b = "toLowerCase", w = "crossOrigin", N = "POST", e = "appInsightsSDK", t = y.name || "appInsights"; (y.name || T[e]) amp;amp; (T[e] = t); var n = T[t] || function (d) { var g = !1, f = !1, m = { initialize: !0, queue: [], sv: "5", version: 2, config: d }; function v(e, t) { var n = {}, a = "Browser"; return n[E   "id"] = a[b](), n[E   "type"] = a, n["ai.operation.name"] = S amp;amp; S.pathname || "_unknown_", n["ai.internal.sdkVersion"] = "javascript:snippet_"   (m.sv || m.version), { time: function () { var e = new Date; function t(e) { var t = ""   e; return 1 === t.length amp;amp; (t = "0"   t), t } return e.getUTCFullYear()   "-"   t(1   e.getUTCMonth())   "-"   t(e.getUTCDate())   "T"   t(e.getUTCHours())   ":"   t(e.getUTCMinutes())   ":"   t(e.getUTCSeconds())   "."   ((e.getUTCMilliseconds() / 1e3).toFixed(3)   "").slice(2, 5)   "Z" }(), iKey: e, name: "Microsoft.ApplicationInsights."   e.replace(/-/g, "")   "."   t, sampleRate: 100, tags: n, data: { baseData: { ver: 2 } } } } var h = d.url || y.src; if (h) { function a(e) { var t, n, a, i, r, o, s, c, u, p, l; g = !0, m.queue = [], f || (f = !0, t = h, s = function () { var e = {}, t = d.connectionString; if (t) for (var n = t.split(";"), a = 0; a < n.length; a  ) { var i = n[a].split("="); 2 === i.length amp;amp; (e[i[0][b]()] = i[1]) } if (!e[C]) { var r = e.endpointsuffix, o = r ? e.location : null; e[C] = "https://"   (o ? o   "." : "")   "dc."   (r || "services.visualstudio.com") } return e }(), c = s[D] || d[D] || "", u = s[C], p = u ? u   "/v2/track" : d.endpointUrl, (l = []).push((n = "SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)", a = t, i = p, (o = (r = v(c, "Exception")).data).baseType = "ExceptionData", o.baseData.exceptions = [{ typeName: "SDKLoadFailed", message: n.replace(/./g, "-"), hasFullStack: !1, stack: n   "nSnippet failed to load ["   a   "] -- Telemetry is disablednHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109nHost: "   (S amp;amp; S.pathname || "_unknown_")   "nEndpoint: "   i, parsedStack: [] }], r)), l.push(function (e, t, n, a) { var i = v(c, "Message"), r = i.data; r.baseType = "MessageData"; var o = r.baseData; return o.message = 'AI (Internal): 99 message:"'   ("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("   n   ")").replace(/"/g, "")   '"', o.properties = { endpoint: a }, i }(0, 0, t, p)), function (e, t) { if (JSON) { var n = T.fetch; if (n amp;amp; !y.useXhr) n(t, { method: N, body: JSON.stringify(e), mode: "cors" }); else if (XMLHttpRequest) { var a = new XMLHttpRequest; a.open(N, t), a.setRequestHeader('RequestVerificationToken', csrfToken),a.setRequestHeader("Content-type", "application/json"), a.send(JSON.stringify(e)) } } }(l, p)) } function i(e, t) { f || setTimeout(function () { !t amp;amp; m.core || a() }, 500) } var e = function () { var n = l.createElement(k); n.src = h; var e = y[w]; return !e amp;amp; "" !== e || "undefined" == n[w] || (n[w] = e), n.onload = i, n.onerror = a, n.onreadystatechange = function (e, t) { "loaded" !== n.readyState amp;amp; "complete" !== n.readyState || i(0, t) }, n }(); y.ld < 0 ? l.getElementsByTagName("head")[0].appendChild(e) : setTimeout(function () { l.getElementsByTagName(k)[0].parentNode.appendChild(e) }, y.ld || 0) } try { m.cookie = l.cookie } catch (p) { } function t(e) { for (; e.length;)!function (t) { m[t] = function () { var e = arguments; g || m.queue.push(function () { m[t].apply(m, e) }) } }(e.pop()) } var n = "track", r = "TrackPage", o = "TrackEvent"; t([n   "Event", n   "PageView", n   "Exception", n   "Trace", n   "DependencyData", n   "Metric", n   "PageViewPerformance", "start"   r, "stop"   r, "start"   o, "stop"   o, "addTelemetryInitializer", "setAuthenticatedUserContext", "clearAuthenticatedUserContext", "flush"]), m.SeverityLevel = { Verbose: 0, Information: 1, Warning: 2, Error: 3, Critical: 4 }; var s = (d.extensionConfig || {}).ApplicationInsightsAnalytics || {}; if (!0 !== d[I] amp;amp; !0 !== s[I]) { var c = "onerror"; t(["_"   c]); var u = T[c]; T[c] = function (e, t, n, a, i) { var r = u amp;amp; u(e, t, n, a, i); return !0 !== r amp;amp; m["_"   c]({ message: e, url: t, lineNumber: n, columnNumber: a, error: i }), r }, d.autoExceptionInstrumented = !0 } return m }(y.cfg); function a() { y.onInit amp;amp; y.onInit(n) } (T[t] = n).queue amp;amp; 0 === n.queue.length ? (n.queue.push(a), n.trackPageView({})) : a() }(window, document, {
            src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source
            // name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
            // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
            // useXhr: 1, // Use XHR instead of fetch to report failures (if available),
            crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
            // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)

            cfg: { // Application Insights Configuration
                instrumentationKey: "$key",
                Access- Control - Allow - Headers: ["RequestVerificationToken"],
                RequestVerificationToken: <%:TokenHeaderValue()%>",
                /* ...Other Configuration Options... */
                endpointUrl: "http://localhost:99/api/appinsightsproxy"
            }
        });
    </script>
 

В целях повторяемости я поместил некоторые части моей попытки в первую строку сценария здесь:

 var csrfToken = "<%:TokenHeaderValue()%>";
function(e, t) {
                    if (JSON) {
                        var n = T.fetch;
                        if (n amp;amp; !y.useXhr) n(t, {
                            method: N,
                            body: JSON.stringify(e),
                            mode: "cors"
                        });
                        else if (XMLHttpRequest) {
                            var a = new XMLHttpRequest;
                            a.open(N, t), a.setRequestHeader('RequestVerificationToken', csrfToken), a.setRequestHeader("Content-type", "application/json"), a.send(JSON.stringify(e))
                        }
                    }
 

Я использовал документацию, представленную по этой ссылке, чтобы попытаться решить эту проблему:
https://docs.microsoft.com/en-us/azure/azure-monitor/app/javascript.

Однако об объекте cfg json не приводится много документации. Даже свойство endpointUrl было обнаружено в ссылке github (установите прокси как endpointUrl), но даже это важное свойство endpointUrl не определено в документации выше.

Два Вопроса: .Есть идеи, как я могу решить проблему с проверкой запроса и можно ли это сделать с помощью объекта cfg json? .Где я могу найти соответствующую документацию по свойствам объекта cfg json?

Комментарии:

1. Вы можете обратиться к открытой проблеме GitHub в документации по объекту сценария cfg на стороне клиента и удалить заголовок токена