Recette améliorée: Intégrer une application ASP.Net MVC 3 sous un site Web IIS hébergeant SharePoint Server 2010

L’avantage de la recette précédente c’est qu’elle était simple et exigeait peu de modification au Web.Config des applications ASP.Net MVC. Mais elle avait l’inconvénient majeur de faire échouer plusieurs soutions (ex. solution qui ajoute des Safe Controls) car l’API de SharePoint ne semble pas supporter les clauses <location path= ». »> d’IIS. Il fallait donc enlever les location du web.config, procéder à l’installation puis les remettre.

Voici donc la nouvelle recette (l’étape 5 est enlevée et l’étape 8 a été ajoutée):

  1. Vous devez créer un “Application Pool” utilisant le “.NET Framework 4.0” et empruntant la même identité (le même compte de service) que l’ “Application Pool” de SharePoint.Puisque le site IIS a un SPN unique (ex. HTTP/nomgentil.domaine.com), celui-ci est déjà défini sur le compte de service en question. Ainsi, il suffira d’ajouter la déléguation vers SQL Server ou SSAS à ce compte selon ce que fait l’application ASP.Net.
  2. Vous pouvez copier le répertoire de votre application ASP.Net sous le répertoire contenant SharePoint. Ex. C:\Inetpub\wss\nomgentil.domain.com\ApplicationMVCNote: Vous pouvez le mettre ailleurs mais cela fonctionne très bien à cet endroit.
  3. Les permissions par défaut ne sont pas les même que pour les sites placés directement sous C:\Inetpub alors assurez-vous de donner les permissions Windows à Users ou autre au répertoire de votre application MVC.
  4. Il faut convertir le virtual directory en application dans IIS en prenant bien soin d’utiliser le pool d’application défini précédemment.
  5. Une application ASP.Net utilise un fichier Web.Config afin de configurer différents éléments propres à .Net. Ce qu’il faut savoir c’est qu’il y a un lien d’héritage entre les Web.Config des applications Web. Ainsi si l’application B est placée sous l’application A dans IIS, elle hérite du Web.Config.Le problème c’est qu’en étant sous SharePoint, on hérite de certains éléments incompatibles avec une application utilisant le “.NET Framework 4.0”. Les étapes 6, 7 et 8 vont travailler dans ce sens.

    On n’ajoute plus de clause <location> autour des noeuds SharePoint.

  6. Il faut déplacer l’élément Xml <sectionGroup> nommé “system.web.extensions” du Web.Config de SharePoint vers le Web.Config qui se trouve à cet endroit: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\Web.Config.

    On doit le mettre sous le noeud <configSections> directement sous <configuration>:

    <configuration>
    < configSections>
    <sectionGroup name= »system.web.extensions » …

    La raison est que le site ASP.Net MVC 3 .NET 4 hérite du Web.Config de SharePoint et ce sectionGroup cause une erreur. On ne peut pas utiliser l’élément <location> à cet endroit. En déplaçant la déclaration directement dans le Web.Config du .NET Framework 2.0, SharePoint en héritera mais pas notre application ASP.Net.

    Vous pouvez obtenir plus d’information ici. Un extrait:

    Move the configSections definition in the Web.config file of the parent application (the application that runs ASP.NET 2.0 or ASP.NET 3.5) into the root Web.config file for the.NET Framework 2.0. The IIS 7 and IIS 7.5 native configuration system scans the configSections element when it merges the hierarchy of configuration files. Moving the configSections definition from the parent Web application’s Web.config file to the root Web.config file effectively hides the element from the configuration merge process that occurs for the child ASP.NET 4 application.

  7. On hérite aussi des Modules du site SharePoint et ceux-ci causent une erreur (en particulier SharePoint14Module). La solution est d’utiliser ce noeud <modules> dans votre application ASP.Net:

    <modules runAllManagedModulesForAllRequests= »true »>
    < remove name= »SPRequestModule » />
    < remove name= »PublishingHttpModule » />
    < remove name= »RSRedirectModule » />
    < remove name= »StateServiceModule » />
    < remove name= »SharePoint14Module » />
    < add name= »Session » type= »System.Web.SessionState.SessionStateModule » />
    < /modules>

    Notez qu’en plus d’enlever les modules spécifiques à SharePoint, on réactive la gestion des Session. Si vous ne le faites pas, vous ne pourrez pas utiliser l’objet Session.

    En fait, comme on ne peut pas utiliser la clause <location> pour <system.webServer>, il faut défaire ce qui est fait par SharePoint. Il se peut que votre implantation nécessite d’activer / désactiver certains modules / “Http Handlers”. Voici un extrait de ce que SharePoint active / désactive:

    <modules runAllManagedModulesForAllRequests= »true »>
    < remove name= »AnonymousIdentification » />
    < remove name= »FileAuthorization » />
    < remove name= »Profile » />
    < remove name= »WebDAVModule » />
    < remove name= »Session » />
    < add name= »SPRequestModule » … />
    < add name= »ScriptModule »  … />
    < add name= »SharePoint14Module » … />
    < add name= »StateServiceModule » … />
    < add name= »RSRedirectModule » … />
    < add name= »PublishingHttpModule » … />
    < /modules>
    < handlers>
    < remove name= »OPTIONSVerbHandler » />
    < remove name= »WebServiceHandlerFactory-Integrated » />
    < remove name= »svc-Integrated » />
    < remove name= »WebDAV » />
    < add name= »svc-Integrated » … />
    < add name= »OwssvrHandler » … />
    < add name= »ScriptHandlerFactory » … />
    < add name= »ScriptHandlerFactoryAppServices » … />
    < add name= »ScriptResource » …  />
    < add name= »JSONHandlerFactory » … />
    < add name= »ReportViewerWebPart » … />
    < add name= »ReportViewerWebControl » … />
    < /handlers>

  8. Les permissions du site MVC sont maintenant héritées du site SharePoint ce qui provoque une erreur dans l’application MVC. Il faut donc ajouter les permissions nécessaires en ajoutant l’élément <trust> dans le web.config de l’application. Ex. :

    <system.web>
    <trust level="Full" originUrl="" />
    </system.web>
  9. IIS Reset
  10. Si vous avez une erreur qui dit que le fichier de configuration n’est pas accessible, donnez temporairement les droits en lecture au groupe local IIS_IUSRS sur ce fichier (l’erreur indique le chemin d’accès).

    Quand IIS n’arrive pas à déterminer l’authentification utilisée (ex. il y a un nœud dupliqué dans les web.config parent et enfant), il doit avoir accès en mode anonyme. Après l’erreur qui sera affichée sera détaillée (ex. le nœud qui ne peut être redéfini etc.)

  11. Si vous avez une erreur HTTP 500 ou une page blanche, même avec customErrors à OFF, vous pouvez utiliser la fonctionnalité des Failed Request Tracing (FREB). Voici comment l’activer pour un site / application.

    C’est ainsi que j’ai su qu’il me fallait désactiver le module SharePoint14Module:

    Request Diagnostics HTTP 500

Bref, oui c’est possible de mettre une application ASP.Net MVC 3 sous SharePoint 2010 mais il faut quand même effectuer un certain nombre de manipulations …

Si vous ne souhaitez pas donner FullTrust à l’application ASP.Net, vous devez:

  1. Ajouter:

    using System.Security;
    [assembly: AllowPartiallyTrustedCallers()]

    dans le fichier AssemblyInfo.cs des Dlls utilisés par votre application afin qu’ils acceptent d’être appelés dans un contexte limité ne permissions.

  2. Définir un fichier de policy listant toutes les permissions nécessaires à votre application (vous pouvez partir d’un fichier utilisé par SharePoint).
  3. Inclure le fichier spécifique en lui donnant un nom et y référer:

    <system.web>
      <securityPolicy>
        <trustLevel name= »MVCTrustLevel » policyFile= »<fullpath> » />
      </securityPolicy>
      <trust level= »MVCTrustLevel » originUrl= » » />
    </system.web>

Bonne chance et à la prochaine …

Une réflexion sur “Recette améliorée: Intégrer une application ASP.Net MVC 3 sous un site Web IIS hébergeant SharePoint Server 2010

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s