Comment journaliser dans un flux UDP visible du réseau local avec NLog

Pressés? Sautez directement à la solution.

Le contexte

La librairie NLog est très bien documentée sur Internet pour une utilisation régulière. Par exemple, la configuration suivante (fichier NLog.config) permet de journaliser dans un fichier portant la date du jour dans un répertoire logs en mode Trace :

<nlog xmlns= »http://www.nlog-project.org/schemas/NLog.xsd »
      xmlns:xsi= »http://www.w3.org/2001/XMLSchema-instance »
      xsi:schemaLocation= »http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd »
autoReload= »true »
throwExceptions= »false »
internalLogLevel= »Off » internalLogFile= »c:\temp\nlog-internal.log »>

  <targets>
<target xsi:type= »File » name= »f » fileName= »${basedir}/logs/${shortdate}.log »
layout= »${longdate} ${uppercase:${level}} ${message} ${when:when=(level = LogLevel.Error):inner=${newline}${exception:format=ToString}} » deleteOldFileOnStartup= »false » />
</targets>
<rules>
<logger name= »* » minlevel= »Trace » writeTo= »f » />
</rules>
</nlog>

Par contre, la journalisation dans un fichier n’est pas toujours pratique. Par exemple, si vous développez une composante serveur, il se peut que les équipes souhaitant consulter le journal n’aient pas un accès physique au répertoire contenant le fichier. Aussi, le compte Windows configuré pour le processus (EXE) qui exécute le code qui journalise doit avoir les droits pour écrire ce fichier.

Je me suis donc mis à chercher une solution qui permettrait de visualiser le journal à distance, à partir d’un poste client, sans passer par un fichier.

La démarche

Je savais que la librairie NLog pouvait être utilisée avec un outil de visualisation de journal tel que Sentinel ou Log2Console. Il suffit d’ajouter la cible suivante et  de l’ajouter dans les règles :

<target xsi:type= »NLogViewer » name= »v » address= »udp://127.0.0.1:9999″/>

<logger name= »* » minlevel= »Trace » writeTo= »v » />

Mais cela fonctionne uniquement lorsque l’outil de visualisation est installé et exécuté localement sur le serveur. Ce n’est pas très avantageux vis-à-vis l’utilisation d’un fichier.

Ma première idée a été d’utiliser une adresse IP multicast (224.0.0.0 à 239.255.255.255) pour le flux UDP. Malheureusement, cela n’a pas fonctionné lors de mes tests. J’ai épuisé toutes mes idées de combinaisons de mots clé à rechercher sur Google pour NLog et multicast et je n’ai rien trouvé.

L’avantage d’un projet à code source libre est que la meilleure documentation reste encore le code en soi. J’ai découvert que les cibles Chainsaw et NLogViewer étaient des spécialisations de la cible Network :

image

Je suis donc allé étudier le code pour voir s’il n’y avait pas une manière de diffuser le flux UDP sur le réseau, plutôt que de toujours fonctionner localement. Lorsque la classe NetworkTarget est configurée avec une adresse UDP (udp://ip:port), sa fabrique de “NetworkSender” crée un UdpNetworkSender. C’est dans cette classe que se cachait le secret pour diffuser le journal sur le réseau local: la méthode CreateSocket contient une condition intéressante:

Uri uri;

if (Uri.TryCreate(this.Address, UriKind.Absolute, out uri) && uri.Host.Equals(IPAddress.Broadcast.ToString(), StringComparison.InvariantCultureIgnoreCase))
{
proxy.UnderlyingSocket.EnableBroadcast = true;
}

La documentation de la propriété EnableBroadcast indique clairement qu’il peut s’agir d’une technique pour diffuser le journal:

Broadcasting is limited to a specific subnet, and must use User Datagram Protocol (UDP.) For Internet Protocol version 4, you can broadcast to your local subnet by sending a packet to 255.255.255.255; or you can use the directed broadcast address, which is the network portion of an Internet Protocol (IP) address with all bits set in the host portion. For example, if your IP address is 192.168.1.40 (a Class C address, with a netmask of 255.255.255.0 — the network portion is the first three octets, and the host portion is the last octet), your directed broadcast address is 192.168.1.255.

Et la condition de la méthode CreateSocket teste si l’adresse de la cible est égale à IPAddress.Broadcast (255.255.255.255) avant de la mettre à true. Bingo!

La solution

La recette est donc la suivante :

<nlog xmlns= »http://www.nlog-project.org/schemas/NLog.xsd »
      xmlns:xsi= »http://www.w3.org/2001/XMLSchema-instance »
      xsi:schemaLocation= »http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd »
autoReload= »true »
throwExceptions= »false »
internalLogLevel= »Off » internalLogFile= »c:\temp\nlog-internal.log »>

  <targets>
<target xsi:type= »Chainsaw » name= »c »  address= »udp://255.255.255.255:9998″ />
</targets>
<rules>
<logger name= »* » minlevel= »Trace » writeTo= »c » />
</rules>
</nlog>

Personnellement je trouve que l’outil Log2Console est moins long à mettre en place sur le poste client. Il suffit de configurer un Receiver sur le même port que celui spécifié pour le « target » du programme qui utilise NLog pour journaliser :

clip_image002

image

Par contre, Sentinel offre plus d’options et permet de sauvegarder la configuration dans un fichier pour une utilisation ultérieure. Voici les étapes :

clip_image002[4]

image

image

image

image

image

image

image

Projet de démonstration

J’ai publié un projet de démonstration sur mon GitHub que vous pouvez utiliser pour tester les cibles NLog décrites dans cette entrée de blogue.

image

En cliquant sur le bouton, le journal contiendra une entrée pour chaque niveau de log supporté par NLog. ll y a trois cibles: File, NLogViewer et Chainsaw. La première cible crée un fichier portant la date du jour dans le répertoire logs. La seconde peut être utilisée avec un outil de visualisation de journal, s’exécutant sur le même poste. La dernière cible démontre l’utilisation de la fonctionnalité de Broadcast en UDP et il est alors possible d’exécuter le programme de visualisation de journal sur un autre poste.

<target xsi:type= »File » name= »f » fileName= »${basedir}/logs/${shortdate}.log »
layout= »${longdate} ${uppercase:${level}} ${message} ${when:when=(level = LogLevel.Error):inner=${newline}${exception:format=ToString}} » deleteOldFileOnStartup= »false » />

<target xsi:type= »NLogViewer » name= »v » address= »udp://127.0.0.1:9999″/>

<target xsi:type= »Chainsaw » name= »c »  address= »udp://255.255.255.255:9998″ />

La conclusion

J’aurais préféré trouver une solution utilisant le protocole UDP en mode multicast. Les routeurs sont intelligents et peuvent envoyer les packets uniquement aux ordinateurs “inscrits” pour un groupe multicast (une adresse IP). De plus, l’outil Log2Console a un champ pour inscrire l’adresse de ce groupe dans sa configuration:

image

Malheureusement je n’y suis pas arrivé. Je préfère ne pas avoir à modifier le code source de NLog alors je devrai me contenter de l’approche utilisant le Broadcast.

Quelques commandes à connaître pour diagnostiquer les problèmes avec Kerberos

Il n’est pas toujours possible d’accéder à la console d’administration d’Active Directory pour consulter les SPNs configurés pour un compte ou pour connaître la liste des services permis pour la délégation.

Voici donc une liste d’outils “Command Line” qui peuvent vous aider à effectuer des diagnostics lorsque votre ami des TI est absent.

KList (C:\Windows\System32)

  1. klist: liste les “tickets” actifs pour le compte courant
  2. klist purge: vide la liste des “tickets” pour le compte courant

SetSpn (C:\Windows\System32)

  1. setspn –l nomcompte: liste les SPNs configurés pour un compte donné
  2. setspn –s nomservice nomcompte: ajoute un SPN au compte spécifié après avoir vérifié qu’il n’y a aucun doublon
  3. setspn –d nomservice nomcompte: supprime un SPN au compte spécifié
  4. setspn –X: Vérifie qu’il n’y a pas de doublons, c’est à dire un SPN enregistré sur plus d’un compte. La présence de doublons peut empêcher Kerberos de fonctionner.

Script PowerShell (Maison)

Il manquait une manière d’obtenir la liste des services autorisés pour la délégation pour un compte donné. Ce script PowerShell vous permet de le faire (en obtenant la liste des SPNs configurés du même coup):

.\ListKerberos.ps1 nomcompte

Merci à mon collègue Georges Turpin pour la trouvaille et l’adaptation.

Voici le contenu du script:

param (
[string]$UserID = $(throw « -UserID required. »)
)

$strUserName = $UserID
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$strFilter = « (&(objectCategory=User)(samAccountName= » + $strUserName + « )) »
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = « Subtree »
$colResults = $objSearcher.FindAll()

foreach ($objResult in $colResults)
{
$objUser = $objResult.GetDirectoryEntry()
$objUser.RefreshCache(@(« canonicalName »))

Write-host  »  servicePrincipalNames » -ForegroundColor Green

$i=1

foreach($SPN in $objUser.servicePrincipalName)
{
Write-host  »    SPN( » $i « )   =    » $SPN
$i+=1
}

Write-host «  »

    « – – – – – »

$objHash = @{}
$objHash.Add(« ADS_UF_SCRIPT », »&h0001″)
$objHash.Add(« ADS_UF_ACCOUNTDISABLE », »&h0002″)
$objHash.Add(« ADS_UF_HOMEDIR_REQUIRED », »&h0008″)
$objHash.Add(« ADS_UF_LOCKOUT », »&h0010″)
$objHash.Add(« ADS_UF_PASSWD_NOTREQD », »&h0020″)
$objHash.Add(« ADS_UF_PASSWD_CANT_CHANGE », »&h0040″)
$objHash.Add(« ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED », »&h0080″)
$objHash.Add(« ADS_UF_TEMP_DUPLICATE_ACCOUNT », »&h0100″)
$objHash.Add(« ADS_UF_NORMAL_ACCOUNT », »&h0200″)
$objHash.Add(« ADS_UF_INTERDOMAIN_TRUST_ACCOUNT », »&h0800″)
$objHash.Add(« ADS_UF_WORKSTATION_TRUST_ACCOUNT », »&h1000″)
$objHash.Add(« ADS_UF_SERVER_TRUST_ACCOUNT », »&h2000″)
$objHash.Add(« ADS_UF_DONT_EXPIRE_PASSWD », »&h10000″)
$objHash.Add(« ADS_UF_MNS_LOGON_ACCOUNT », »&h20000″)
$objHash.Add(« ADS_UF_SMARTCARD_REQUIRED », »&h40000″)
$objHash.Add(« ADS_UF_TRUSTED_FOR_DELEGATION », »&h80000″)
$objHash.Add(« ADS_UF_NOT_DELEGATED », »&h100000″)
$objHash.Add(« ADS_UF_USE_DES_KEY_ONLY », »&h200000″)
$objHash.Add(« ADS_UF_DONT_REQUIRE_PREAUTH », »&h400000″)
$objHash.Add(« ADS_UF_PASSWORD_EXPIRED », »&h800000″)
$objHash.Add(« ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION », »&h1000000″)

[string]$intUAC = $objUser.userAccountControl.Value

Foreach ($objKey in $objHash.Keys)
{
[string]$intKey = $objHash.Item($objKey)

If (($intUAC -bAnd $intKey) -ne 0)
{
switch ($objKey)
{
« ADS_UF_SCRIPT »{« The logon script is executed. »}
« ADS_UF_ACCOUNTDISABLE »{« The user account is disabled. »}
« ADS_UF_HOMEDIR_REQUIRED »{« The home directory is required. »}
« ADS_UF_LOCKOUT »{« The account is currently locked out. »}
« ADS_UF_PASSWD_NOTREQD »{« No password is required. »}
« ADS_UF_PASSWD_CANT_CHANGE »{« The user cannot change the password. « }
« ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED »{« The user can send an encrypted password. »}
« ADS_UF_TEMP_DUPLICATE_ACCOUNT »{« This is an account for users whose primary account is in another domain. »}
« ADS_UF_NORMAL_ACCOUNT »{« This is a default account type that represents a typical user. »}
« ADS_UF_INTERDOMAIN_TRUST_ACCOUNT »{« This is a permit to trust account for a system domain that trusts other domains. »}
« ADS_UF_WORKSTATION_TRUST_ACCOUNT »{« This is a computer account for a computer that is a member of this domain. »}
« ADS_UF_SERVER_TRUST_ACCOUNT »{« This is a computer account for a system backup domain controller that is a member of this domain. »}
« ADS_UF_DONT_EXPIRE_PASSWD »{« The password for this account will never expire. »}
« ADS_UF_MNS_LOGON_ACCOUNT »{« This is an MNS logon account. »}
« ADS_UF_SMARTCARD_REQUIRED »{« The user must log on using a smart card. »}
« ADS_UF_TRUSTED_FOR_DELEGATION » { « DELEGATION – Trust this user for delegation to any service (Kerberos only). » }
« ADS_UF_NOT_DELEGATED »
{
« DELEGATION – Trust this user for delegation to specified services only (use any protocol): »
$objUser.properties[« msDS-AllowedToDelegateTo »]
}
« ADS_UF_USE_DES_KEY_ONLY »{« Restrict this principal to use only Data Encryption Standard (DES) encryption types for keys. »}
« ADS_UF_DONT_REQUIRE_PREAUTH »{« This account does not require Kerberos pre-authentication for logon. »}
« ADS_UF_PASSWORD_EXPIRED »{« The user password has expired. »}
« ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION »
{
« DELEGATION – The account is enabled for delegation: »
$objUser.properties[« msDS-AllowedToDelegateTo »]
}
default {« Could not find the UAC »}
}
}
}
}

Est-ce que cette information vous a été utile? Utilisez-vous d’autres outils? N’hésitez pas à commenter …

Nouvelles fonctionnalités de l’outil de QA SYNTELL pour Reporting Services (SSRS)

Il y a eu beaucoup de changements dans l’outil de QA SYNTELL depuis la parution des articles suivants (2011) sur ce blogue:

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

Présentation de notre outil de test automatisé pour Reporting Services

Voici maintenant la matrice des types de jeux d’essais / type de tests supportés:

Type de jeu d’essai Intégrité Performance Multi threading Non régression Sécurité Applicative
Rapports SSRS

X

X

X

X

X

Requêtes SQL et MDX

X

X

X

X

X

Applications Web

X

X

X

X

Plus de détails:

  1. Fiche technique du produit
  2. Liste détaillée des fonctionnalités

Cet outil est actuellement utilisé chez plusieurs de nos clients pour effectuer:

  1. De la surveillance: vérification constante du bon fonctionnement des serveurs de données et applicatifs (avec notification par courriel);
  2. De l’éveil : réchauffer des serveurs applicatifs pour s’assurer que les performances seront au rendez-vous.

Et à l’interne pour faire:

  1. Des tests d’intégrité: vérification qu’aucun élément ne retourne d’erreur lors de son exécution;
  2. Des tests de performance: plusieurs faciliants pour identifier les composantes les plus lentes d’une application et faire le suivi de la performance globale d’une livraison à l’autre;
  3. Des tests de charge: s’assurer que l’application n’a pas de défaillance en multithread et qu’il n’y a pas de dégradation anormale de la performance;
  4. Des tests de non régression pour les requêtes: confirmer que les requêtes existantes retournent les même résultats lors d’une modification aux bases de données qui ne devraient pas modifier ceux-ci;
  5. Des tests de non régression sur les rapports: comparaison de l’exécution d’un jeu d’essai de rapports SSRS avec une exécution précédente. Cela se fait visuellement sous forme d’image et aussi au niveau des données XML générées par les rapports.
  6. Des tests de sécurité applicative ou personnalisation: les différentes jeux d’essai peuvent être exécutés avec différentes identités. Cela permet de tester la sécurité applicative ou la personnalisation propre à un groupe d’utilisateurs.

Une des fonctionnalités les plus appréciée de nos utilisateurs est celle qui permet de faire des tests comparatifs (non régression) sur l’exécution de rapports SSRS. Le processus est le suivant:

  1. Un analyste fonctionnel navigue dans l’application Reporting Services afin de créer un jeu d’essai significatif;
  2. L’outil de QA importe ce jeu d’essai à partir des journaux SSRS (ExecutionLogStorage) avec la possibilité d’exclure certains paramètres qui pourraient compromettre la pérennité du jeu d’essai;
    image
  3. L’analyste lance l’exécution du jeu d’essai en stockant les résultats dans la base de données (MHTML, TIFF et XML de chaque rapport);
    image
  4. Une capture instantanée (snapshot) est créée à partir de cette exécution: c’est une image figée dans le temps;
    image
  5. Une nouvelle version de rapports est publiée;
  6. Le même jeu d’essai est réexécuté sur ces nouveaux rapports;
  7. La commande permettant de comparer une exécution avec une capture instantanée est utilisée:
    image
    Il est possible de comparer un sous-ensemble à la fois:
    image
    Si un noeud est en rouge c’est qu’il y a une différence. Le programme affiche le deux exécutions (MHTML, TIFF, XML) et la différence dans le bas (visuellement pour TIFF, et texte pour XML):
    image
    Comparaison XML:
    image
    Un rapport peut être exporté sur plusieurs pages TIFF, chacune étant comparée:
    image

Imaginez tout le temps qui peut être épargné en laissant l’outil travailler pour vous. Augmentez votre confiance lors de vos livraisons!

Pour obtenir plus d’information ou pour planifier une démonstration, n’hésitez pas à entrer en contact avec nous: contact@syntell.com.

Plusieurs lecteurs de ce blogue viennent d’en dehors du Canada, une séance WebEx est possible.

Beaucoup d’actions dans Reporting Services 2016

Je suis de retour d’un mandat à temps plein de juillet à décembre à la ville de Québec. En plus de faire de l’analyse organique j’étais aussi responsable du développement en Microsoft Windows Presentation Framework (WPF), Entity Framework avec de la communication réseau TCP et du multi-threading. C’était dans le cadre du projet du Gestionnaire Artériel de la ville de Québec.

Pendant mon absence, il s’est passé beaucoup de choses du côté de Reporting Services. D’ici à ce que j’aie plus de temps, voici quelques liens:

Microsoft Business Intelligence – our reporting roadmap
SQL Server 2016: Everything built-in
Position report parameters the way you want
A closer look to report parameters position
Report rendering for modern browsers
Integrate Reporting Services into SharePoint 2016
Introducing mobile reports and a brand-new web portal
How to create Mobile Reports and KPI’s in SQL Server Reporting Services 2016 An end-to-end walkthrough
Download Microsoft® SQL Server® 2016 CTP3.1 Report Builder
Download Microsoft SQL Server Mobile Report Publisher (Public Preview 1)

Je devrais retrouver du temps pour garder ce blogue en vie,

Générer un hyperlien (url) absolu à partir de Reporting Services (SSRS)

Il est parfois nécessaire de générer un lien vers un rapport SSRS en utilisant Go to URL plutôt que Go to report:

image

Afin de ne pas coder en dur le protocole (ex. http), le serveur, la collection de sites (ex. /sites/sitecol), le site (ex. /sites/sitecol/siteparent/sitechild) et la librairie de documents (ex. /sites/sitecol/siteparent/sitechild/doclib), nous avons accès aux variables Globals!ReportFolder et Globals!ReportServerUrl.

La variable ReportServerUrl change si on est en design-time (BIDS / SSDT-BI) et une fois dans SharePoint, selon la version de Reporting Services.

Environnement

Valeur

BIDS / SSDT-BI (vide)
SSRS 2008 dans SharePoint Url vers le serveur de rapport.
Ex. http://server/ReportServer
SSRS 2012 http://server/sites/sitecol/siteparent/sitechild/_vti_bin/ReportServer

Le lien vers un rapport SSRS, intégré en mode SharePoint, doit ressembler à ceci:

http://server/sites/sitecol/siteparent/sitechild/_layouts/ReportServer/RSViewerPage.aspx?rv:RelativeReportUrl=/sites/sitecol/siteparent/sitechild/Reports/RPT-1.rdl

Puisque la valeur de la variable change ReportServerUrl, cela complique la vie du développeur de rapports.

Cette fonction VB.Net, qui peut directement être placée dans la section code d’un rapport, peut vous aider:

Public Function GetReportUrl(Optional ByVal sReportName As String = Nothing) As String
  Dim sUseReportFolder    As String
  Dim sUseReportServerUrl  As String
  Dim sSiteUrl            As String
  Dim sRelReportUrl       As String
  Dim sUseReportName      As String

  sUseReportFolder = Iif(String.IsNullOrEmpty(Report.Globals.ReportFolder), "http://server/sites/sitecol/site/doclib", Report.Globals.ReportFolder)
  sUseReportServerUrl = Iif(String.IsNullOrEmpty(Report.Globals.ReportServerUrl), "http://server/sites/sitecol/site/_vti_bin/ReportServer", Report.Globals.ReportServerUrl)
  sUseReportServerUrl = sUseReportServerUrl.Replace("_vti_bin/ReportServer", "")
  
  sSiteUrl = sUseReportFolder.Substring(0, sUseReportFolder.LastIndexOf("/"))
  sRelReportUrl = sUseReportFolder.Substring(sUseReportServerUrl.IndexOf("/", sUseReportServerUrl.IndexOf("//") + 2))
  sUseReportName = Iif(String.IsNullOrEmpty(sReportName), Report.Globals.ReportName, sReportName)
  
  Return String.Format("{0}/_layouts/ReportServer/RSViewerPage.aspx?rv:RelativeReportUrl={1}/{2}", sSiteUrl, sRelReportUrl, sUseReportName) 
End Function

Vous pouvez l’appeler sans paramètre pour créer un lien vers le rapport courant:

=Code.GetReportUrl()

Ou en passant le nom d’un autre rapport:

=Code.GetReportUrl(« Rpt-01.rdl »)

Le code teste si les variables sont vides et si c’est le cas, des valeurs par défaut sont utilisées. Cela permet de tester directement dans BIDS / SSDT-BI.

C’est un problème qui revient souvent.

Quelques notes sur l’authentification par formulaire avec SSRS intégré à SharePoint

Il est possible d’utiliser un mode d’authentification propriétaire dans SharePoint: il suffit de se définir un ASP.Net Membership Provider. Si vous avez aussi besoin de définir des rôles afin de faciliter l’autorisation du contenu pour les différents utilisateurs, vous devrez aussi définir un ASP.Net Role Provider.

En mode Claims (ex. avec SharePoint 2010), vous aurez besoin de modifier plusieurs Web.Config afin d’intégrer votre Membership et Role provider:

  1. Ceux de vos applications Web (ex. SharePoint – 80)
  2. Celui de SharePoint Administration
  3. Celui de Security Token Service sous SharePoint Web Services

Si vous avez plusieurs “applications SSRS” accessibles par différents types d’utilisateurs, l’idéal serait de définir des rôles (ex. Analysts, Executives etc.) et de sécuriser les sites SharePoint contenant les rapports SSRS avec ces rôles. La structure de site serait donc:

  1. Site racine (/)
  2. Sous-site pour les analystes (/Analysts) accessible uniquement pour les membres du rôle Analysts
  3. Sous site pour les exécutifs (/Executives) accessible uniquement pour les membres du rôle Executives

La navigation de SharePoint enlève automatiquement les liens vers les sites dont l’utilisateur n’ont pas accès. Par exemple, si un utilisateur n’est n’est ni dans le rôle Analysts ni dans le rôle Executives, la section “Sites and Workspaces” sera vide:

image

Si vos rapports utilisent des sources de données XML (ex. sur un fichier de configuration), vous devrez stocker ces fichiers statiques dans un site SharePoint où l’accès anonyme a été autorisé. La raison est que les sources de données XML supportent uniquement l’authentification Windows ou Anonyme. Il n’est pas possible d’utiliser une identité stockée (ex. compte de service) avec ce type de connexion.

Donc notre site racine permettrait l’accès anonyme et contiendrait une librairie de documents contenant ces fichiers statiques. Les sources de données XML référeraient à ces fichiers en mode anomyme:

  1. L’application Web doit permettre l’accès anonyme:

    image

  2. Le site racine doit permettre l’accès anonyme:

    image

    image

  3. La source de données XML doit être en mode anonyme:

    image

  4. Les utilisateurs doivent s’authentifier pour accéder aux rapports:

    image

    image

    Autrement, ils auront cette erreur:

    image

    Reporting Services does not support anonymous user from a SharePoint site. To view Reporting Services reports, choose a SharePoint site that does not have Anonymous access enabled or sign in on an anonymous site.

Si vous utilisez des sources de données vers des bases de données Analysis Services (SSAS) et que celles-ci utilisent la sécurité de données vous pourrez utiliser cette technique:

  1. Un compte Active Directory devra être créé pour représenter un rôle dans la base de données SSAS (ex. Analysts et Executives).
  2. Une composante (ex. procédure stockée SQL) devra être capable de faire correspondre un utilisateurs formulaire vers un rôle (ex. Analyste1 est dans le rôle Analysts).
  3. Les rapports définissent des connexions directement dans le rapport (et non dans une source de données partagée) afin de pouvoir utiliser une expression qui ajoute EffectiveUserName=Analysts|Executives à la fin. Le rapport appelle la composante en #2 pour obtenir le nom du compte Windows à utiliser dans EffectiveUserName.
  4. L’identité d’un compte de service, administrateur de l’instance SSAS, devra être utilisée pour la connexion. C’est requis afin d’être en mesure d’utiliser EffectiveUserName.

J’en parle avec plus de détails dans mon article intitulé: Authentification par formulaire, SharePoint, SSRS et sécurité des données dans SSAS

SYNTELL a réalisé plusieurs mandats où l’on devait intégrer l’authentification propriétaire du client au sein d’une solution Microsoft BI.

Références

Claims Walkthrough: Creating Forms-Based Authentication for Claims-Based SharePoint 2010 Web Applications Using ASP.NET SQL Membership and Role Providers
https://msdn.microsoft.com/en-us/library/office/gg252020%28v=office.14%29.aspx

Forms Authentication in SharePoint Products and Technologies (Part 2): Membership and Role Provider Samples
https://msdn.microsoft.com/en-us/library/office/bb975135%28v=office.12%29.aspx

XML Connection Type (SSRS)
https://msdn.microsoft.com/fr-ca/library/dd220468.aspx?f=255&MSPPError=-2147217396

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