2009-09-27 4 views
2

J'essaie de faire fonctionner une application ASP.NET MVC ... J'aurais dû savoir que ce ne serait pas facile. Les premières pages fonctionnent, mais elles sont toutes statiques. La première fois qu'un contrôleur est exécuté, j'obtiens l'exception ci-dessous.L'application ASP.NET MVC a SecurityException

Voici la méthode d'action du contrôleur:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index(Section? section, int? parent) 
{ 
    if (section == null) 
    { 
     return RedirectToAction("Index", "Questions", new {section = Section.Section0}); 
    } 

    IPagedList<Question> questions = _surveyService.FetchQuestions(User.Identity.Name, section.Value, parent); 

    // ... 

    ViewResult result = View("Index", questions); 
    result.ViewData.Add("CurrentSection", section.Value); 
    result.ViewData.Add("Parent", parent); 
    result.ViewData.Add("IsLastPage", questions.IsLastPage); 

    return result; 
} 

L'exception est levée dans la deuxième ligne de la méthode à RedirectToAction().

Contexte:

  • J'ai suivi les instructions this answer.
  • Je n'utilise pas la réflexion ou la sécurité exigeante explicitement dans mon code.
  • J'utilise MVC, LINQ to SQL, Elmah et PagedList.
  • J'utilise IIS 7 avec Mode intégré.
  • J'ai ajouté [assembly: AllowPartiallyTrustedCallers] à mon AssemblyInfo.cs. Je l'ai fait parce que j'ai trouvé une autre question Stack Overflow qui avait une réponse le recommandant (je ne peux pas le trouver maintenant, sinon je fournirais un lien). J'ai aussi fort nommé mes assemblées comme suggéré par la réponse de Rex M ci-dessous.

Qu'est-ce que je manque pour faire ce travail?

L'exception:

Server Error in '/surveys/objectification' Application. 
    Security Exception 
    Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file. 

    Exception Details: System.Security.SecurityException: That assembly does not allow partially trusted callers. 

    Source Error: 

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

    Stack Trace: 

    [SecurityException: That assembly does not allow partially trusted callers.] 
     SelfObjectificationSurvey.Web.Controllers.QuestionsController.Index(Nullable`1 section, Nullable`1 parent) +0 
     lambda_method(ExecutionScope , ControllerBase , Object[]) +123 
     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 


    Version Information: Microsoft .NET Framework Version:2.0.50727.3074; ASP.NET Version:2.0.50727.4049 
+0

Je suis curieux, comment est-ce qu'une question de 7 ans avec une réponse acceptée s'est fermée? – jrummell

Répondre

2

Une autre chose que vous pouvez vérifier que, selon cette article, il y a certains types de .NET qui ne peuvent pas être utilisés dans un ensemble de confiance partiel, même si elle a été décorée avec AllowPartiallyTrustedCallersAttribute.

Voir .NET Framework Assemblies and the AllowPartiallyTrustedCallers Attribute pour une liste complète.

Update 2 Êtes-vous sûr que tous les ensembles tiers que vous appelez sont également décorées avec l'attribut AllowPartiallyTrustedCallers? Par exemple, en regardant le AssemblyInfo.cs pour PagedList 1.1, il ne semble pas contenir cet attribut.

Mise à jour 1: Vous avez raison, cette liste de types inutilisables a l'air très datée.

Ce LINQ to SQL FAQ a quelques informations intéressantes au sujet de son utilisation dans un environnement de confiance partielle:

APTCA

Q. Est-System.Data.Linq marqué pour une utilisation par code partiellement approuvé?

R. Oui, l'assemblée System.Data.Linq.dll est parmi les .NET Framework ensembles marqués avec l'attribut AllowPartiallyTrustedCallersAttribute . Sans ce marquage, les assemblages dans le .NET Framework sont et sont destinés à être utilisés uniquement par le code de confiance totale.

Le scénario principal LINQ to SQL pour permettre aux appelants de confiance partielle est de permettre l'assemblage LINQ à SQL être accessible à partir des applications Web, où la configuration de la confiance est moyen.

+0

C'est une ancienne liste (.NET 1.1), et j'espère que System.Data.SqlClient n'est pas encore dessus. – jrummell

+0

Jusqu'à présent, j'ai supprimé elmah et j'ai toujours l'exception, PagedList est la prochaine ... – jrummell

+0

PagedList était le problème, merci! Je l'ai recompilé avec l'attribut AllowPartiallyTrustedCallers et cela a fonctionné. Je vais enregistrer un problème pour cela sur le codeplex au cas où d'autres se trébucheraient dessus. – jrummell

2

-ce que vos assemblées strong-named? AllowPartiallyTrustedCallersAttribute est uniquement efficace lorsqu'il est appliqué par un assembly nommé fort au niveau de l'assembly.

+0

Non, ils ne le sont pas. Je vais essayer. – jrummell

+0

J'ai ajouté une clé de nom fort, recompilé, téléchargé et essayé à nouveau. Il a donné la même exception =/ – jrummell

1

Vous devrez peut-être avoir besoin du mode confiance totale pour exécuter votre code. La plupart des hôtes n'autorisent qu'une confiance moyenne, comme le fait aussi GoDaddy. Vous devrez peut-être passer votre hôte à un autre qui vous donnera la confiance totale.

Bien que MVC seul ne nécessite pas plus que la confiance moyenne, votre autre code peut cependant. Il vous suffira d'avoir une vérification de type à l'exécution quelque part dans votre code afin d'adopter une réflexion qui, à son tour, voudra avoir la confiance totale.

+0

Selon cette réponse, http://stackoverflow.com/questions/266205/is-there-a-way-that-i-can-run-a-asp-net-mvc-project-on-godaddy-com- shared-web-hos/299339 # 299339, vous pouvez héberger ASP.NET MVC en confiance moyenne avec GoDaddy. Les seules choses que j'ai ajoutées sont LINQ to SQL et PagedList. Autant que je déteste GoDaddy, je ne veux pas changer avant que mon compte expire l'année prochaine. – jrummell

0

LINQ to SQL peut-être le problème - LINQ to SQL génère généralement une procédure stockée. Si votre code essaye de le faire en confiance moyenne, cela pourrait provoquer l'exception APTCA.

+0

LINQ to SQL ne génère pas de procédures stockées ... à bail pas dans mon projet. – jrummell

2

Sortez vos assemblages un par un pour voir qui est le coupable. Pas besoin de deviner. J'ai eu ce problème avec les bibliothèques Microsoft Enterprise.

+0

Jusqu'à présent, j'ai supprimé elmah et j'ai toujours l'exception, PagedList est la prochaine ... – jrummell

+0

Vu que vous l'avez résolu, heureux que cela a aidé. –

+0

C'est fait! Si je pouvais accepter plusieurs réponses, je l'accepterais aussi. – jrummell