Sicherheitsausnahme mit MySQL und Entity Framework auf GoDaddy
-
18-09-2019 - |
Frage
Wir bekommen eine SecurityException
wenn Entity Framework auf GoDaddy verwenden. Die Einheit wurde gegen einen MySQL Speicher konfiguriert ist. (V. 6.1.2) Ein bisschen Verrücktheit, mit der Ausnahme, obwohl ... bei Ausnahme der Suche stapelt es scheint zu implizieren, dass, wenn wir eine Verbindung zu MySQL auf der gesamten Webseite zu öffnen, dann sollten wir die gleiche Ausnahme erhalten; jedoch scheint eine MySQL-Verbindung öffnet sich direkt in einem anderen Teil der Website zu arbeiten ...
Hier ist die Prüfung:
using (MySqlConnection connection = new MySqlConnection(ConnectionString))
{
connection.Open();
...
}
Wer über ein ähnliches Problem laufen?
Der komplette Fehler-Stack-Trace ist wie folgt:
[SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.]
System.Reflection.MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags) +0
System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +470
System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +1051
System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +111
System.Resources.ResourceManager.CreateResourceSet(Stream store, Assembly assembly) +357
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) +471
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) +583
System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) +583
System.Resources.ResourceManager.GetString(String name, CultureInfo culture) +74
MySql.Data.MySqlClient.Resources.get_PerfMonCategoryName() +40
MySql.Data.MySqlClient.PerformanceMonitor..ctor(MySqlConnection connection) +43
MySql.Data.MySqlClient.MySqlConnection.Open() +434
System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure) +173
System.Data.EntityClient.EntityConnection.Open() +96
System.Data.Objects.ObjectContext.EnsureConnection() +81
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +46
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +44
jet.Controllers.WorkOrder.WorkOrderView..ctor() +219
jet.Controllers.WorkOrder.WorkOrderView.get_Instance() +29
jet.Controllers.WorkItemController.Index() +11
lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +53
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +258
System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +20
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +193
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +382
System.Web.Mvc.Controller.ExecuteCore() +123
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +23
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +144
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +54
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Lösung 2
Justin war genau das Richtige. Problem war GoDaddy hat eine ältere Version des MySQL-DLL in ihrer Gac und der Entity Framework wurde Kommissionierung it up!
Hier ist die Lösung. (Wenden Sie diese auf web.config)
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d"/>
<bindingRedirect oldVersion="5.0.7.0" newVersion="6.1.2.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
...
</configuration>
Andere Tipps
Schräge ein. GoDaddy Shared-Hosting ASP.NET-Anwendungen unter Medium Trust auszuführen und perf Zähler Schöpfung erfordert wahrscheinlich volles Vertrauen, aber perf Zähler Schöpfung ist nicht, was hier versagt. (Und wenn es scheitert, wäre es nicht propagieren aus, da perf coutner Schaffung Ausnahmen von mySQL-Client-Code verschluckt werden).
Stattdessen es andernfalls versucht, eine Zeichenfolge-Ressource zuzugreifen, bevor perf Zähler Schöpfung. Der Fehler ist mit dieser Codezeile in Resources.Designer.cs des MySQL-Client:
return ResourceManager.GetString("PerfMonCategoryName", resourceCulture)
Ein paar Dinge zu versuchen, um mit steigendem Schwierigkeitsgrad:
-
sicherzustellen, dass Sie den MySQL-Client-DLLs in Ihrer App IST-Verzeichnis haben und Sie versuchen, nicht den Client-DLL aus GoDaddys GAC zu laden. Nie hängt von GoDaddy gelieferten Binär-Dateien, wenn Sie es vermeiden können!
-
Umstellung auf EN-US-Kultur, damit der Client muss nicht gehen für eine andere Ressource DLL Jagd, und sehen, ob das Problem verschwindet.
-
Erstellen Sie den .NET-Client aus dem Quellcode, anstelle von DLLs aus einer binären Verteilung in Ihre App IST-Verzeichnis zu kopieren. Dies wird wie diese macht Probleme leichter zu debuggen, da der mySQL-Code wird keine Blackbox sein. Und in einer Prise, lassen Sie die problematischen Ressource-Abrufen Anrufe ändern (oder schwer Code der locale)! : -)
BTW, falls Sie sich in Versuchung „Use Performance Monitor = false“ in der Verbindungszeichenfolge zu setzen, um zu versuchen, das Problem zu umgehen, nicht die Mühe. Der problematische Code ausgeführt wird, unabhängig von dieser Einstellung:
public PerformanceMonitor(MySqlConnection connection)
{
this.connection = connection;
//// this line is where it bombs
string categoryName = Resources.PerfMonCategoryName;
//// this line is affected by connection string setting
if (connection.Settings.UsePerformanceMonitor && procedureHardQueries == null)
{
try
{
procedureHardQueries = new PerformanceCounter(categoryName,
"HardProcedureQueries", false);
procedureSoftQueries = new PerformanceCounter(categoryName,
"SoftProcedureQueries", false);
}
catch (Exception ex)
{
Logger.LogException(ex);
}
}
}
ich einfach hinzugefügt trust level = "Full" auf meiner Web-Konfigurationsdatei, und es funktionierte