#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 на стороне клиента и удалить заголовок токена