Büyüleyici.
Verilen cevaplar eksik.
İlk olarak, daha önce de belirtildiği gibi, birden fazla izin verilen ana bilgisayar ekleyemezsiniz, bu desteklenmez.
İkinci olarak, bu değeri dinamik olarak HTTP yönlendiricisinden çıkarmanız gerekir; bu, değeri Web.config dosyasına ekleyemeyeceğiniz anlamına gelir, çünkü her zaman aynı değer değildir.
Tarayıcı Chrome olduğunda izin vermeyi önlemek için tarayıcı algılama yapmak gerekli olacaktır (hata ayıklama konsolunda, konsolu hızla doldurabilen veya uygulamayı yavaşlatabilen bir hata oluşturur). Bu aynı zamanda Edge'i yanlışlıkla Chrome olarak tanımladığı için ASP.NET tarayıcı algılamasını değiştirmeniz gerektiği anlamına gelir.
Bu, ASP.NET'te, her istekte çalışan, isteğin yönlendiricisine bağlı olarak her yanıt için bir http başlığı ekleyen bir HTTP modülü yazarak yapılabilir. Chrome için İçerik-Güvenlik-Politikası eklemesi gerekiyor.
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 işlevini HTTP modülü Init işlevinde kaydetmeniz gerekir.
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);
}
}
Daha sonra modülü uygulamanıza eklemeniz gerekir. Bunu Global.asax içinde HttpApplication'ın Init işlevini geçersiz kılarak programlı olarak yapabilirsiniz, örneğin:
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)
{
}
}
}
veya uygulama kaynak koduna sahip değilseniz Web.config dosyasına giriş ekleyebilirsiniz:
<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'daki girdi IIS7 + içindir, diğeri system.web'deki IIS 6
içindir. RunAllManagedModulesForAllRequests'i true olarak ayarlamanız gerektiğini unutmayın, çünkü düzgün çalışır.
Türdeki dize biçimdedir "Namespace.Class, Assembly"
. Derlemenizi C # yerine VB.NET'te yazarsanız, VB her proje için varsayılan bir Ad Alanı oluşturur, böylece dizeniz şöyle görünür
"[DefaultNameSpace.Namespace].Class, Assembly"
Bu sorunu önlemek istiyorsanız, DLL'yi C # ile yazın.