เนโครแมนซิ่ง.
คำตอบที่ให้มาไม่สมบูรณ์
อย่างแรกตามที่ได้กล่าวไปแล้วว่าคุณไม่สามารถเพิ่มโฮสต์ที่อนุญาตหลายรายการซึ่งไม่ได้รับการสนับสนุน
ประการที่สองคุณต้องดึงค่านั้นออกจากผู้อ้างอิง HTTP แบบไดนามิกซึ่งหมายความว่าคุณไม่สามารถเพิ่มค่าให้กับ Web.config ได้เนื่องจากไม่ใช่ค่าเดียวกันเสมอไป
จำเป็นต้องทำการตรวจจับเบราว์เซอร์เพื่อหลีกเลี่ยงการเพิ่ม allow-from เมื่อเบราว์เซอร์เป็น Chrome (จะทำให้เกิดข้อผิดพลาดในคอนโซล debug ซึ่งสามารถเติมเต็มคอนโซลได้อย่างรวดเร็วหรือทำให้แอปพลิเคชันช้า) นั่นหมายความว่าคุณต้องแก้ไขการตรวจจับเบราว์เซอร์ ASP.NET เนื่องจากระบุ Edge เป็น Chrome อย่างไม่ถูกต้อง
สิ่งนี้สามารถทำได้ใน ASP.NET โดยการเขียนโมดูล HTTP ซึ่งทำงานในทุกคำขอที่ต่อท้าย http-header สำหรับทุกการตอบสนองขึ้นอยู่กับผู้อ้างอิงของคำขอ สำหรับ Chrome จำเป็นต้องเพิ่ม Content-Security-Policy
public class BrowserInfo
{
public System.Web.HttpBrowserCapabilities Browser { get; set; }
public string Name { get; set; }
public string Version { get; set; }
public string Platform { get; set; }
public bool IsMobileDevice { get; set; }
public string MobileBrand { get; set; }
public string MobileModel { get; set; }
public BrowserInfo(System.Web.HttpRequest request)
{
if (request.Browser != null)
{
if (request.UserAgent.Contains("Edge")
&& request.Browser.Browser != "Edge")
{
this.Name = "Edge";
}
else
{
this.Name = request.Browser.Browser;
this.Version = request.Browser.MajorVersion.ToString();
}
this.Browser = request.Browser;
this.Platform = request.Browser.Platform;
this.IsMobileDevice = request.Browser.IsMobileDevice;
if (IsMobileDevice)
{
this.Name = request.Browser.Browser;
}
}
}
}
void context_EndRequest(object sender, System.EventArgs e)
{
if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
{
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
try
{
response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
if (System.Web.HttpContext.Current.Request.UrlReferrer != null)
{
string host = System.Web.HttpContext.Current.Request.UrlReferrer.Scheme + System.Uri.SchemeDelimiter
+ System.Web.HttpContext.Current.Request.UrlReferrer.Authority
;
string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;
if (IsHostAllowed(refAuth))
{
BrowserInfo bi = new BrowserInfo(System.Web.HttpContext.Current.Request);
if (!System.StringComparer.OrdinalIgnoreCase.Equals(bi.Name, "Chrome"))
response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);
System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>();
ls.Add("default-src");
ls.Add("'self'");
ls.Add("'unsafe-inline'");
ls.Add("'unsafe-eval'");
ls.Add("data:");
ls.Add(selfAuth);
ls.Add(refAuth);
string contentSecurityPolicy = string.Join(" ", ls.ToArray());
response.AppendHeader("Content-Security-Policy", contentSecurityPolicy);
}
else
{
response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
}
}
else
response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
}
catch (System.Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
}
private static string[] s_allowedHosts = new string[]
{
"localhost:49533"
,"localhost:52257"
,"vmcompany1"
,"vmcompany2"
,"vmpostalservices"
,"example.com"
};
public static bool IsHostAllowed(string host)
{
return Contains(s_allowedHosts, host);
}
public static bool Contains(string[] allowed, string current)
{
for (int i = 0; i < allowed.Length; ++i)
{
if (System.StringComparer.OrdinalIgnoreCase.Equals(allowed[i], current))
return true;
}
return false;
}
คุณต้องลงทะเบียนฟังก์ชัน context_EndRequest ในฟังก์ชัน HTTP-module Init
public class RequestLanguageChanger : System.Web.IHttpModule
{
void System.Web.IHttpModule.Dispose()
{
}
void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
{
context.EndRequest += new System.EventHandler(context_EndRequest);
}
}
ถัดไปคุณต้องเพิ่มโมดูลลงในแอปพลิเคชันของคุณ คุณสามารถดำเนินการทางโปรแกรมได้ใน Global.asax โดยการแทนที่ฟังก์ชัน Init ของ HttpApplication ดังนี้:
namespace ChangeRequestLanguage
{
public class Global : System.Web.HttpApplication
{
System.Web.IHttpModule mod = new libRequestLanguageChanger.RequestLanguageChanger();
public override void Init()
{
mod.Init(this);
base.Init();
}
protected void Application_Start(object sender, System.EventArgs e)
{
}
protected void Session_Start(object sender, System.EventArgs e)
{
}
protected void Application_BeginRequest(object sender, System.EventArgs e)
{
}
protected void Application_AuthenticateRequest(object sender, System.EventArgs e)
{
}
protected void Application_Error(object sender, System.EventArgs e)
{
}
protected void Session_End(object sender, System.EventArgs e)
{
}
protected void Application_End(object sender, System.EventArgs e)
{
}
}
}
หรือคุณสามารถเพิ่มรายการใน Web.config หากคุณไม่ได้เป็นเจ้าของซอร์สโค้ดของแอปพลิเคชัน:
<httpModules>
<add name="RequestLanguageChanger" type= "libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />
</modules>
</system.webServer>
</configuration>
รายการใน system.webServer ใช้สำหรับ IIS7 + อีกรายการใน system.web ใช้สำหรับ IIS 6
โปรดทราบว่าคุณต้องตั้งค่า runAllManagedModulesForAllRequests เป็น true เพื่อให้ทำงานได้อย่างถูกต้อง
"Namespace.Class, Assembly"
สตริงในชนิดที่อยู่ในรูปแบบ โปรดทราบว่าถ้าคุณเขียนแอสเซมบลีของคุณใน VB.NET แทน C # VB จะสร้างเนมสเปซเริ่มต้นสำหรับแต่ละโปรเจ็กต์ดังนั้นสตริงของคุณจะมีลักษณะดังนี้
"[DefaultNameSpace.Namespace].Class, Assembly"
หากคุณต้องการหลีกเลี่ยงปัญหานี้ให้เขียน DLL ใน C #