2010-12-16 115 views
0

J'ai une application où je rends un rapport SSRS via le service Web SOAP. Ce que je tente de faire est de transmettre les informations d'identification au service ReportExecutionService qui sera utilisé par la source de données pour l'accès à la base de données.SSRS DataSourceCredentials et l'authentification Windows

Cela fonctionne actuellement en utilisant l'authentification SQL. Ce que j'essaie de comprendre, c'est comment obtenir ce travail pour un utilisateur qui est configuré pour la base de données en utilisant l'authentification Windows. Le compte d'utilisateur est un compte d'utilisateur de domaine et j'ai ajouté cet utilisateur à la base de données et au rôle db_owner.

Quand je passe les informations d'identification pour un compte d'utilisateur Windows et exécutez SQL Profiler je reçois le message d'erreur suivant:

Login failed for user 'ourdomain\User'. Reason: Attempting to use an NT account name with SQL Server Authentication. [CLIENT: <local machine>] 

Le code suivant est le code (en abrégé) qui fonctionne en passant les informations d'identification pour une l'utilisateur SQL, mais à défaut avec le message ci-dessus lors du passage des informations d'identification utilisateur de domaine:

public static byte[] RunReport(string reportPath, List<ReportParameter> reportParameters, ReportOutputType outputType) 
     { 
      ReportExecutionService reportExecutionService = new ReportExecutionService(); 

      var creds = new DataSourceCredentials[1]; 

      creds[0] = new DataSourceCredentials() { DataSourceName = "DynamicDataSource", UserName = ReportUserDomain + @"\" + ReportUserAccount, Password = ReportUserPassword }; 

      reportExecutionService.LoadReport(reportPath, null); 

      reportExecutionService.SetExecutionCredentials(creds); 

      return reportExecutionService.Render(Enum.GetName(typeof(ReportOutputType), outputType), GetDeviceInfo(outputType), out extension, out mimetype, out encoding, out warning, out streamids); 
     } 

Notez que j'ai ajouté le paramètre ReportUserDomain aux DataSourceCredentials pour essayer d'obtenir que cela fonctionne pour Windows Auth, le code qui est actuellement workin g pour l'authentification SQL n'inclut pas cette variable.

Toute aide est grandement appréciée.

Répondre

3

Impossible de trouver un moyen de transmettre des informations d'identification utilisateur Windows via l'objet DataSourceCredentials et de s'authentifier auprès de SQL Server. Il semble que cette fonctionnalité ne supporte que l'authentification SQL Server. Ce que j'ai fini par faire pour résoudre le problème était de définir la source de données sur tous les rapports à "Utiliser l'authentification Windows (sécurité intégrée)" au lieu de "invite pour les informations d'identification". Je passe ensuite les DefaultCredentials de CredentialCache au ReportExecutionService, qui transmet essentiellement les informations d'identification de l'utilisateur Windows sous lequel s'exécute AppPool. J'ai ensuite accordé l'accès à la base de données et SSRS pour ce compte d'utilisateur Windows, et les choses fonctionnent comme prévu.

Cela, malheureusement, ne tient pas compte du scénario d'utilisation des informations d'identification pour un compte d'utilisateur Windows distinct du compte AppPool. Par exemple, un compte d'utilisateur utilisé exclusivement à des fins de reporting. Malgré cela, la solution est adaptée à mes besoins.