Mes articles les plus populaires

Parfois j’ai une idée d’article à publier sur mon blogue. Intuitivement je me dis que c’est un sujet qui pourrait intéresser un grand nombre de personnes ou qui pourait sérieusement donner un coup de main à une poignée de personnes dans le cas d’un sujet plutôt pointu et très mal couvert par la documentation officielle ou les autres blogues.

WordPress me donne la possibilité de connaître les articles ayant reçus le plus de traffic. Sans surprise, plus l’article est vieux, meilleures sont les chances que le nombre soit élevé. La page d’accueil prend la part du lion et ne me permet pas de savoir quel article est populaire ou non:

Page d’accueil / Archives
10 460

Mais éventuellement, si un article est populaire, les gens tomberont dessus via un engin de recherche (la plupart du temps Google). Mes articles les plus populaires sont ceux qui traitent d’aspects complexes de Reporting Services intégré à SharePoint ainsi que l’utilisation d’applications MVC sous un site SharePoint.

Voici des liens vers mes articles les plus populaires (au moins 100 visites) :

Intégration Reporting Services 2012 à SharePoint 2010: Oubliez tout ce que vous savez
1749

Quelques trucs lors du développement Web en mode déconnecté (offline)
1 610

Comment faire disparaitre les erreurs DCOM 10016 suite à une installation SharePoint
1 341

Intégrer une application ASP.Net MVC 3 sous un site Web IIS hébergeant SharePoint Server 2010
857

Kerberos avec Windows Server 2008 R2, SharePoint 2010 et SSRS R2 sur la même machine + Host Header : La recette
748

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

Manuellement accorder l’accès aux bases de données de SharePoint au compte de service de SSRS
509

Reporting Services 2012 et la configuration Kerberos: désolé vous devrez utiliser la constrained delegation avec C2WTS
507

SharePoint 2013 en mode Claims. Pourquoi IIS est configuré en Anonymous, Forms et Windows Authentication?
504

Présentation de notre outil de déploiement de rapports SSRS
499

Comment exploiter le format MHTML (archive Web) retourné par SSRS
426

Construire un hyperlien pour lancer l’export d’un rapport SSRS en mode intégré à SharePoint
387

Intégrer une application ASP.Net MVC sous un site Web IIS hébergeant WSS 3.0 / SharePoint 2007
384

Comment refaire une interface visuelle par dessus Reporting Services en utilisant les services Web
247

Pourquoi nous avons développé un outil de test automatisé pour Reporting Services
245

Ce que vous devez absolument savoir sur Reporting Services pour expliquer certains comportements au niveau de la performance …
240

Recette améliorée: Intégrer une application ASP.Net MVC sous un site Web IIS hébergeant WSS 3.0 / SharePoint 2007
219

SSRS – Le nerf de la guerre c’est le contrôle de la requête
174

Nos extensions SSRS design-time et runtime
159

Quelques nouveautés MVC 4
144

L’affichage d’un rapport échoue à partir du site SharePoint mais fonctionne directement à partir du ReportServer en mode intégré
136

Code C# pour convertir un rapport SSRS 2008 R2 en format SSRS 2008 R1
134

Quelles sont les compétences nécessaires pour être un bon développeur ASP.Net MVC?
133

Authentification par formulaire, SharePoint, SSRS et sécurité des données dans SSAS
131

Références pour comprendre Kerberos et s’outiller pour diagnostiquer sa configuration
130

Publiez vos tableaux de bord Reporting Services sur le iPad grâce à SYNTELL
129

Des rapports SSRS à partir d’un iPad grâce à une mise à jour de SharePoint 2010 (CU 2011-12)
125

Reporting Services et les unités de mesure (cm, inch)
119

Comment spécifier la culture (langue) lors d’un appel à SSRS via le Report Server Proxy de SharePoint
116

Comment extraire le fichier Manifest.xml ou RootObjectMap.xml d’un fichier *.CMP généré par l’API SharePoint Content Migration
108

Collection de sites en lecture seule: procédure et comportement
108

Comment minimiser les connexions à SQL Server lors de l’exécution d’un rapport SSRS
108

User!Language et SharePoint 2010
102

Caractères accentués, ASP.Net MVC Razor et boutons de dialogue JQuery UI
102

Liens vers d’excellents articles (sujets divers)

J’ai eu à travailler sur des mandats qui sortent un peu (et même beaucoup) du sujet principal de ce blogue. Par contre, dans mon expérience, plus on en connaît sur des sujets variés en technologie, meilleur on devient pour avoir une vison d’ensemble d’un système complexe.

J’ai accumulé des kilomètres de documentation dans mon OneNote mais certains articles ont su se démarquer et j’ai voulu les publier ici.

Bonne lecture!

Cryptographie

ECC

A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography
http://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/

NTRU

Open Source NTRU Public Key Cryptography and Reference Code
https://github.com/NTRUOpenSourceProject/ntru-crypto

NTRUEncrypt and NTRUSign in Java
http://sourceforge.net/projects/ntru/files/

TPM

Introduction To Trusted Computing
http://opensecuritytraining.info/IntroToTrustedComputing.html

Crypto chip: How the TPM bolsters enterprise security
http://www.scmagazine.com/crypto-chip-how-the-tpm-bolsters-enterprise-security/article/111865/

The Trusted Platform Module Explained
http://www.cryptomathic.com/news-events/blog/the-trusted-platform-module-explained

FPGA

Principes fondamentaux du FPGA
http://www.ni.com/white-paper/6983/fr/

How does an FPGA work?
https://embeddedmicro.com/tutorials/mojo/how-does-an-fpga-work/

Microsoft Supercharges Bing Search With Programmable Chips
http://www.wired.com/2014/06/microsoft-fpga/

Will 2015 Be the Year of the FPGA?
http://www.hpcwire.com/2014/09/04/will-2015-year-fpga/

Mémoire flash

Flash SSD Jargon Explained
http://www.storagesearch.com/ssd-jargon.html

MLC vs SLC: Which flash SSD is right for you?
http://www.computerweekly.com/feature/MLC-vs-SLC-Which-flash-SSD-is-right-for-you

SLC vs MLC – does it matter any more?
http://storageswiss.com/2014/02/26/slc-vs-mlc-does-it-matter-any-more/

Industrial Grade vs. Commercial Grade
http://www.cactus-tech.com/en/cactus-difference/industrial-grade-vs-commercial-grade

Comment faire de la .NET Reflection sur un Assembly sans le charger dans le AppDomain principal

AppDomain 101

Mon premier article indiquait la marche à suivre afin d’exécuter du code d’un Assembly sans le charger dans le AppDomain principal. Il fallait définir une interface connue des deux parties et la solution était plutôt simple.

AppDomain 102

Maintenant, on va augmenter la complexité d’un cran. Supposons que vous ne pouvez pas utiliser d’interface et que vous devez rechercher des classes / méthodes respectant une certaine convention de nommage et acceptant certains paramètres.

Lorsque l’on fait de la .NET Reflection, on utilise des méthodes comme Assembly.LoadFrom / Assembly.Load pour obtenir un Assembly, et des instances de Assembly, Type et MethodInfo pour obtenir de l’information dynamique sur les classes et leurs méthodes.

Ces classes n’héritent pas de MarshalByRefObject et ne peuvent donc pas être utilisées en Remoting. Dès que vous tenterez d’obtenir une instance à ces types dans votre AppDomain principal afin d’invoker une méthode par Reflection, cela aura pour effet de charger l’Assembly dans l’AppDomain. Et c’est ce qu’on tente d’éviter!

La solution? Il faut utiliser le design pattern Proxy et se créer des classes Proxy sur les classes Type, Assembly et MethodInfo.

Un peu comme Interfaces.dll était partagé par les deux AppDomain, ReflectionProxy.dll sera partagé lui aussi:

image

Dans le AppDomain principal, il faudrait se créer un nouveau AppDomain et instancier toutes les classes au sein de celui-ci afin d’éviter de charger les Assembly dans le AppDomain principal.

La classe AppDomainProxy va se charger de créer un nouvel AppDomain et va permettre d’obtenir une instance de la classe AssemblyProxy (GetAssemblyProxy) et de créer n’importe quelle autre classe (CreateInstance) à partir du nom complet de l’assembly et de la classe.

Elle utilise la classe AssemblyResolver qui permet de spécifier des répertoires où rechercher les Assemblies si ceux-ci ne sont pas dans le repertoire de l’application ou le GAC.

Il est possible d’effectuer de la Reflection à partir de la classe AssemblyProxy. Par exemple, la méthode FindClassInAssemblies permet de rechercher une classe portant certain nom dans une liste d’Assemblies. Cette méthode retourne un TypeProxy qui permet de rechercher des méthodes via la méthode FindMethod. TypeProxy pourrait être étendue pour supporter les propriétés, selon vos besoins.

L’instance de MethodInfo retournée permet d’invoker des méthodes statiques ou d’instance via Invoke ou InvokeStatic. Pour utiliser Invoke, il faudra obtenir une instance de la classe en passant par AppDomainProxy.CreateInstance.

Voici un extrait de mon exemple complet:

try
{
  using (AppDomainProxy pAppDomainProxy = new AppDomainProxy())
  {
    AssemblyProxy pAssemblyProxy = pAppDomainProxy.GetAssemblyProxy();
    TypeProxy pTypeProxy = pAssemblyProxy.FindClassInAssemblies(new string[] { cboAssemblyName.Text }, cboClassName.Text);

    if (pTypeProxy != null)
    {
      MethodInfoProxy pMethodInfoProxy = pTypeProxy.FindMethod("GetValue", new string[] { "System.String" });

      if (pMethodInfoProxy != null)
      {
        object pInstance = pAppDomainProxy.CreateInstance(cboAssemblyName.Text, cboClassName.Text);
        object pResult = pMethodInfoProxy.Invoke(pInstance, new object[] { txtParameter.Text });
        txtOutput.Text = Convert.ToString(pResult);
        MessageBox.Show("Now is the time to look both AppDomain before it gets deleted!");
      }
    }
  }
}
catch (Exception pException)
{
  MessageBox.Show(pException.Message);
}

Dans cet exemple, cboAssemblyName.Text contiendrait par exemple PluginA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null et cboClassName.Text vaudrait PluginA.ClassA.

Si si on exécute mon programme d’exemple:

image

Avant d’utiliser le bouton Execute, on voit qu’il y aura un seul AppDomain principal et que celui-ci ne chargera aucun plugin:

image

Puis, en cliquant sur le bouton, une instance de la classe est créée et une méthode est appelée. Avant de fermer la boîte de dialogue:

image

On va rafraîchir l’Application Domain Viewer et confirmer qu’un nouveau AppDomain a été créé et qu’il a chargé le plugin:

image

En fermant la boîte de dialgue, cet AppDomain temporaire sera détruit:

image

Et on voit que ReflectionProxy reste dans le AppDomain principal.

La meilleure manière de comprendre ce qui se passe est d’utiliser mon exemple complet publié sur GitHub.

Références

AppDomainProxyReflection (GitHub)
https://github.com/samsonfr/AppDomainProxyReflection

AppDomainProxyReflection (Zip)
Téléchargez le fichier Zip

AppDomain Viewer
http://labs.workshare.com/2010/08/app-domain-viewer.html#comment-form

Kerberos avec Windows Server 2008 R2, SharePoint 2010 et SSRS R2 sur la même machine + Host Header : La recette

La topologie d’un déploiement SharePoint avec Reporting Services n’est jamais la même. Il est possible d’installer Reporting Services sur le même serveur que SharePoint, de le placer sur un serveur applicatif séparé ou de le mettre à même le serveur de données (SQL et SSAS).

De plus la version de Windows a un impact sur la version d’IIS, SharePoint est soit WSS 3.0, WSS 4.0, MOSS 2007 ou MOSS 2010 et il y a SSRS R1 et SSRS R2 …

C’est pourquoi il y a beaucoup d’information sur Internet (voir références) mais très peu qui donne la recette exacte pour un déploiement donné. Mon article vise à lister les grandes lignes de mon déploiement ce qui pourrait vous aider dans un déploiement similaire.

Dans mon cas, le serveur de données (SQL / SSAS) était séparé du serveur SharePoint 2010 d’où la nécessité d’utiliser Kerberos (double hop). Afin de ne pas avoir à ajouter le serveur de données à la ferme (ex. pour qu’il serve à d’autres SharePoint), on a choisi d’installer une instance de Reporting Services à même le serveur SharePoint 2010.

On se retrouve avec la situation suivante: le Report Server Web Service et SharePoint utilisent le même “service class”. Comme il n’est pas possible d’enregistrer le même SPN (ex. HTTP/server.domain) sur deux comptes de services AD différents (un pour le AppPool de SharePoint et l’autre pour le service de Reporting Services) il faut donc utiliser le même compte de service pour les deux. Lire cet extrait de technet:

HTTP is the service class. The Report Server Web service runs in HTTP.SYS. A by-product of creating an SPN for HTTP is that all Web applications on the same computer that run in HTTP.SYS (including applications hosted in IIS) will be granted tickets based on the domain user account. If those services run under a different account, the authentication requests will fail. To avoid this problem, be sure to configure all HTTP applications to run under the same account, or consider creating host headers for each application and then creating separate SPNs for each host header. When you configure host headers, DNS changes are required regardless of the Reporting Services configuration.

Si vous avez plusieurs Application Pool dans SharePoint (ex. Project Server et SharePoint côte à côte), utilisez le même compte de service.

Voici la liste des choses que j’ai eu à faire:

  1. Assigner le même compte de service à tous les AppPool de SharePoint ainsi que pour SSRS.
  2. Mettre <RSWindowsNegotiate /> pour <AuthenticationTypes> dans C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\rsreportserver.config
  3. Créer une adresse pour le Report Server en utilisant le nom de la machine (http://server/ReportServer) même si SharePoint utilise un HOST HEADER (de type A) pour une de ses applictions Web.
    image
  4. Configurer l’intégration SSRS dans SharePoint:
    image
  5. S’assurer que l’application Web SharePoint utilise Kerberos pour toutes les zones:
    image
    image
  6. Vérifier qu’IIS est en Negotiate,NTLM et non juste en NTLM (par défaut c’était correct). cscript adsutil.vbs get w3svc\NTAuthenticationProviders
  7. Comme SharePoint utilise des HOST Header, il faut désactiver le LoopbackCheck (manière explicite ou globale).
  8. Créer les SPNs pour SQL server sur le compte de service utiliseé par SQL Server (ex. cs-sql)MSSQLSvc/NetBIOS:1433
    MSSQLSvc/FQDN:1433
  9. Créer les SPNs pour SSAS sur le compte de service utiliseé par celui-ci (ex. cs-ssas)MSOLAPSvc.3/NetBIOS
    MSOLAPSvc.3/FQDN
  10. Créer les SPNs vers le serveur SharePoint (et dans mon cas vers le HOST HEADER de type A) pour le compte utilisé par SharePoint et SSRS (ex. cs-http)HTTP/NetBIOS
    HTTP/FQDN
    HTTP/HostHeader
    HTTP/HostHeaderFQDN (ex. HTTP/alias.domain.com)
  11. Permettre la délégation pour tous les services (Kerberos) pour le compte utilisé par SharePoint et SSRS.
    image
  12. Permettre la délégation vers SQL Server pour le compte de service utilisé par SSAS (ex. cs-ssas) si le cube doit accéder au comptoir de données (Datamart).
    image
  13. Pour le site IIS du SharePoint qui n’utilise pas de HOST HEADER (ex. SharePoint – 80) j’ai dû activer le Kernel Mode en spécifiant l’utilisation de l’identité du AppPool. Autrement je ne pouvais plus accéder à ce site, il demandait mon identité à l’infini (popup).Il faut Modifier C:\Windows\System32\inetsrv\config\applicationHost.config:

    <location path= »SharePoint – 80″>
    <system.webServer>
    <security>
    <authentication>
    <windowsAuthentication enabled= »true » useKernelMode= »true » useAppPoolCredentials= »true »>
    (…)
    </location>

Constrained Delegation

Normalement j’utilise la mécanique plus stricte pour la délégation Kerberos. Dans ce cas je n’ai pas réussi à la faire fonctionner. D’après ce que j’ai lu, il aurait fallu créer un HOST HEADER de type A différent pour le Report Server. Cela nous aurait permis d’avoir un SPN distinct pour celui-ci. Ainsi nous aurions pu utiliser un compte de service différent pour le Report Server et faire en sorte que le compte de service SharePoint (ex. cs-sharepoint avec HTTP/sharepoint.domain.com) délègue vers le compte de service ssrs (ex. cs-ssrs avec HTTP/reportserver.domain.com) qui aurait délégué vers SQL Server et SSAS.

WireShark

Quand tout fonctionne, voici les requêtes Kerberos que vous devriez voir passer dans WireShark sur le serveur SharePoint (rapport SSRS accédant des données sur un serveur SQL distant):
image
image

1) TGS-REQ – MSSQLSvc/server>.syntell.com:1433
image

2) TGS-REP – MSSQLSvc/server>.syntell.com:1433
image

3) TGS-REQ – krbtgt/SYNTELL.COM
image

4) TGS-REP – krbtgt/SYNTELL.COM
image

Quand je tentais d’utiliser la délégation spécifique, mon TGS-REQ et TGS-REP étaient sur:
Server Name (Enterprise Name): <compte de service sharepoint>@syntell.com ce qui ne fait aucun sens et échouait.

Références

  1. Kerberos delegation and Windows 2008
  2. Kerberos Issues With Reporting Services and SharePoint in a Distributed Environment
  3. Manage Kerberos Authentication Issues in a Reporting Services Environment
  4. Configuring Kerberos Authentication in SharePoint 2010
  5. How to: Register a Service Principal Name (SPN) for a Report Server
  6. Solving the Reporting Services Login issue in the February CTP of SQL Server 2008
  7. Free Software – SharePoint Kerberos Buddy – Detect And Repair Kerberos Issues

Reporting Services a besoin d’un certificat SSL valide

J’étais en train de documenter la procédure pour configurer SharePoint en HTTPS pour un client. Il semblait déjà y avoir un certificat sur mon serveur de test. J’avais accès au site SharePoint mais dès que je tentais d’accéder à un rapport Reporting Services, j’obtenais l’erreur:

An unexpected error occurred while connecting to the report server. Verify that the report server is available and configured for SharePoint integrated mode. –> The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. –> The remote certificate is invalid according to the validation procedure.

On voit bien dans la barre d’adresse que le certificat que j’utilisais était invalide:

image

J’ai cherché une solution pour indiquer à SharePoint / IIS / Windows que mon certificat était valide mais j’ai conclu qu’il était plus simple de demander à mon administrateur réseau de me fournir un certificat valide à l’interne … Reporting Services ne supporte pas les Self Signed Certificates.

Avec IIS7, il est plutôt facile de créer une demande de certificat:

image

image

image

Puis lorsque le certificat a été émis, il suffit de compléter la procédure:

image

N’oubliez pas que Reporting Services intégré à WSS 3.0 ne supporte pas plusieurs zones (AAM: Alternate Address Mapping) donc vous devez créer votre application Web en HTTPS:

image

Et vous devez manuellement aller choisir le certificat dans le Site Binding:

image

En espérant vous éviter une perte de temps.

Si vous avez des questions sur nos produits et services, n’hésitez pas à nous contacter.

Comment spécifier la culture (langue) lors d’un appel à SSRS via le Report Server Proxy de SharePoint

Dans une entrée de blogue précédente, j’expliquais comment faire pour lancer l’export d’un rapport SSRS intégré à SharePoint vers un format tel PDF, Word, Excel etc.

Construire un hyperlien pour lancer l’export d’un rapport SSRS en mode intégré à SharePoint

En gros, il fallait utiliser un hyperlien dans ce format:

http://<SharePoint_site>/_vti_bin/ReportServer?
http://<SharePoint_site>/<SharePoint_Document_Library>/
<Report_Name>&rs:Command=Render&rs:Format=MHTML

L’inconvénient de cette méthode c’est que contrairement aux appels via RSViewerPage.aspx …

http://<SharePoint_site>/_layouts/ReportServer/RSViewerPage.aspx?rv:RelativeReportUrl=/<SharePoint_Document_Library>/<Report_Name>.rdl

… la langue du site SharePoint n’est pas automatiquement assignée à la variable User!Languagedans les rapports SSRS.

C’est très fâcheux car cette variable est normalement utilisée pour spécifier la culture du rapport ainsi que pour obtenir des libellés selon la langue (ex. libellés stockés dans un fichier de ressource *.resx).

Si vous utilisez votre fureteur (ex. IE) pour accéder au Report Server Proxy, c’est votre préférence de culture qui sera utilisée:

image

Mais si vous y allez de manière programmatique via l’objet WebRequest, la variable User!Language contiendra plutôt la langue par défautdu Report Server qui est déterminée par la valeur choisie lors de la création des bases de données du Report Server:

image

La solution est d’ajouter une en-tête HTTP Accept-Language à l’objet WebRequest (ex. sCulture = « fr-CA »):

if (!String.IsNullOrEmpty(sCulture))
{
pRequest.Headers.Add(« Accept-Language », sCulture);
}

Voici un extrait plus complet:

Exemple de variables d’entrée:

Variable Valeur
sBaseUrl http://<server>/<SPSite>/_vti_bin/ReportServer
sAbsoluteReportUrl http://<server>/<SPSite>/<SPDocLib>/<Report>.rdl
sCulture fr-CA
sQueryString Param1=Param1Value&Param2=Param2Value&rs:Command=Render&rs:Format=XML

string sRequestUrl = sBaseUrl + « ? » + sAbsoluteReportUrl;
WebRequest pRequest = WebRequest.Create(sRequestUrl);

if (String.IsNullOrEmpty(msUserName) || String.IsNullOrEmpty(msPassword))
{
pRequest.Credentials = CredentialCache.DefaultCredentials;
pRequest.UseDefaultCredentials = true;
}
else
{
NetworkCredential pNetworkCredentials = !String.IsNullOrEmpty(msDomain) ? new NetworkCredential(msUserName, msPassword, msDomain) : new NetworkCredential(msUserName, msPassword);
pRequest.PreAuthenticate = true; // Avoid one round trip: says to the server, let’s authenticate
pRequest.UseDefaultCredentials = false;
pRequest.Credentials = pNetworkCredentials;
}

// Prepare query string

pRequest.Method = « POST »;

if (!String.IsNullOrEmpty(sCulture))
{
pRequest.Headers.Add(« Accept-Language », sCulture);
}

pRequest.ContentLength =  sQueryString.Length;
pRequest.ContentType = « application/x-www-form-urlencoded »;
byte[] abytPOSTData = Encoding.UTF8.GetBytes(sQueryString);
Stream pDataStream = pRequest.GetRequestStream();
pDataStream.Write(abytPOSTData, 0, abytPOSTData.Length);
pDataStream.Close();

// The response will need to be closed by callers

return pRequest.GetResponse();

Si vous avez des questions sur nos produits et services, n’hésitez pas à nous contacter.

Kerberos, ASP.Net et IIS_WPG

Quel est le lien entre Kerberos, ASP.Net et IIS_WPG?

Lorsqu’une application ASP.Net est configurée pour utiliser l’authentification Windows:

<authentication mode= »Windows » />

Et qu’on souhaite personifier l’utilisateur entrant:

<identity impersonate= »true » />

Pour accéder un serveur SQL distant:

<connectionStrings>
<add name= »<ConnectionName> » connectionString= »Data Source=<ServerName>;Initial Catalog=<DataBaseName>;Integrated Security=SSPI » providerName= »System.Data.SqlClient » />

Si vous vous demandez la différence entre Integrated Security=SSPI et Integrated Security=True, vous pouvez aller lire ceci.

En passant, vous ne pouvez pas spécifier un utilisateur de domaine dans la chaîne de connexion (via User Id et Password). C’est uniquement un utilisateur SQL Server qui peut être utilisé. Pour utiliser une identité de domaine, il faut plutôt impersonifier celui-ci:

<identity impersonate= »true » userName= »accountname » password= »password » />

Vous devrez configurer Kerberos pour que l’identité de la personne qui accède à l’application ASP.Net puisse être déléguée jusqu’au serveur SQL.

Idéalement il faut définir un utilisateur de domaine qui sera utilisé pour l’Application Pool de l’application. Il faut ajouter des SPNs (ex. HTTP/webserver.domaine.com) sur cet utilisateur et activer la “Constrained Delegation” vers SQL Server.

image

Malgré tout, il se peut que vous obteniez cette erreur à partir d’un poste client (double hop):

Login failed for user ‘NT AUTHORITY\ANONYMOUS LOGON’.

Et c’est là qu’entre en jeu le groupe local nommé IIS_WPG.

This step is done to allow the application pool identity the ability to impersonate the user on the web server. If you look at the computer’s user right assignments you will see Impersonate a client after authentication and the IIS_WPG group is added there by default.

Référence: Fun with the Kerberos Delegation Web Site (étape 7)

Bref, le compte que vous avez utilisé pour l’Application Pool de votre application ASP.Net doit être ajouté au groupe local IIS_WPG pour être en mesure d’impersonifier un autre utilisateur.

image

Lorsqu’il s’agit d’une application SharePoint, cette étape n’est pas nécessaire car SharePoint ajoute automatiquement l’utilisateur de son Application Pool à ce groupe.

Une alternative à cette solution est de configurer SQL Server pour accepter l’authentification mixe et mettre cette utilisateur directement dans la chaîne de connexion de SQL.

Mais chez Syntell nous préférons utiliser Kerberos et désactiver l’authentification mixe.

Si vous avez des questions sur nos produits et services, n’hésitez pas à nous contacter.