Comment déployer (programmatiquement) des rapports/connexions/ressources vers Reporting Services en mode intégré à SharePoint configuré pour utiliser l’authentification par formulaire

Normalement lorsqu’on utilise le service Web ReportingService2006.asmx pour déployer des rapports, des connexions ou des fichiers de ressources (ex. images), on utilise l’identité de la personne courante ou bien une identité spécifique du domaine Windows. Par exemple:

mpSSRS = new ReportingServices2008.ReportingService2006();

if (String.IsNullOrEmpty(msUserName) || String.IsNullOrEmpty(msPassword))
{
mpSSRS.Credentials = CredentialCache.DefaultCredentials;
mpSSRS.UseDefaultCredentials = true;
}
else if (!String.IsNullOrEmpty(msDomain))
{
mpSSRS.Credentials = new NetworkCredential(msUserName, msPassword, msDomain);
mpSSRS.UseDefaultCredentials = false;
}
else
{
mpSSRS.Credentials = new NetworkCredential(msUserName, msPassword);
mpSSRS.UseDefaultCredentials = false;
}

Le problème c’est que cela fonctionne uniquement lorsque SharePoint est configuré pour utiliser l’authentification Windows ou Basique. Si votre SharePoint utilise l’authentification par formulaire (mécanique standard ou via votre propre Custom Membership Provider), cela ne marchera pas.

La solution passe via un autre service Web: ReportServiceAuthentication.asmx et la classe System.Net.CookieContainer.

Il faut d’abord s’authentifier via LogonUser avec le nom d’utilisateur et le mot de passe. Cela va nous retourner le nom du cookie qui a été créé (souvent .ASPXAUTH) dans le CookieContainer. Lors de la création du service ReportingService2006, il faudra lui assigner le même CookieContainer de manière à authentifier l’utilisateur.

Voici un extrait de ma preuve de concept que je vais intégrer à notre outil de déploiement de rapports SSRS. Dans cet exemple je déploie un fichier de ressource via la méthode CreateResource. Mais cela fonctionne aussi pour les rapports:

string sCookieName;
CookieContainer pCookieContainer = new CookieContainer();
ReportServiceAuthentication.ReportServiceAuthentication pRSAuth = new ReportServiceAuthentication.ReportServiceAuthentication();

pRSAuth.CookieContainer = pCookieContainer;
pRSAuth.Url = txtSiteUrl.Text + « /_vti_bin/ReportServer/ReportServiceAuthentication.asmx »;

if (pRSAuth.LogonUser(txtUserName.Text, txtPassword.Text, null, out sCookieName))
{
txtCookieName.Text = sCookieName;
ReportService2006.ReportingService2006 pSSRS = new ReportService2006.ReportingService2006();
pSSRS.CookieContainer = pCookieContainer;
pSSRS.Url = txtSiteUrl.Text + « /_vti_bin/ReportServer/ReportService2006.asmx »;

byte[] abytFile = File.ReadAllBytes(ctlBrowse.FilePath);
string sFileName = Path.GetFileName(ctlBrowse.FilePath);
string sMIME = « text/css »;

  ReportService2006.CatalogItem pFile = pSSRS.CreateResource(sFileName, txtSiteUrl.Text + « / » + txtDocLib.Text, true, abytFile, sMIME, null);
MessageBox.Show(pFile.Path);
}
else
{
MessageBox.Show(« Login Failed »);
}

J’ai trouvé la documentation plutôt mince sur ce sujet. Comme on se trouve à l’intersection d’ASP.Net, SharePoint et Reporting Services, il n’y avait pas grande chose sur le sujet en ligne. Le secret c’est le partage de l’objet CookieContainer.

Et comment faire pour connaître la méthode d’authentification utilisée par SharePoint? Microsoft a pensé à tout:

ReportServiceAuthentication.ReportServiceAuthentication pRSAuth = new ReportServiceAuthentication.ReportServiceAuthentication();
pRSAuth.UseDefaultCredentials = true;
pRSAuth.Url = txtSiteUrl.Text + « /_vti_bin/ReportServer/ReportServiceAuthentication.asmx »;
MessageBox.Show(pRSAuth.GetAuthenticationMode().ToString());

Les valeurs possibles sont: Forms, None, Passport et Windows

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

Laisser un commentaire