2011-09-01 2 views
0

Je crée une application Web asp.net à l'aide de Microsoft Report Viewer. Il se connecte à une base de données SQL à l'aide de la sécurité intégrée. Cependant quand je charge la page de rapport après sa publication au serveur (tout fonctionne bien au niveau local), je reçois cette erreur:Échec de la connexion de Microsoft Report Viewer

An error has occurred during report processing. 
Exception has been thrown by the target of an invocation. 
Login failed for user 'SERVER NAME REMOVED'. 

La chose étrange est que lorsque je clique sur le bouton d'actualisation sur le rapport (pas le bouton d'actualisation d'IE), il se charge très bien. Je sais que la connexion ne fonctionnera pas pour le serveur de base de données, mais pourquoi le visualiseur de rapports n'utilise-t-il pas la sécurité intégrée que j'ai définie dans le fichier web.config?

Répondre

0

Vous devez mettre en œuvre IReportServerCredentials inteface, voir la mise en œuvre ci-dessous:

public class CustomReportCredentials : IReportServerCredentials 
    { 
     protected string _username = string.Empty; 
     protected string _password = string.Empty; 
     protected string _domainName = string.Empty; 

     public CustomReportCredentials(string userName, string password, string domainName) 
     { 
      _username = userName; 
      _password = password; 
      _domainName = domainName; 
     } 
     public bool GetFormsCredentials(out System.Net.Cookie authCookie, out string userName, out string password, out string authority) 
     { 
      authCookie = null; 
      userName = password = authority = null; 
      return false; 
     } 

     public System.Security.Principal.WindowsIdentity ImpersonationUser 
     { 
      get { return null; } 
     } 

     public System.Net.ICredentials NetworkCredentials 
     { 
      get 
      { 
       if (_username != "noadmin") 
       { 
        return new NetworkCredential(_username, _password, _domainName); 
       } 
       else 
       { 
        Uri uri = new Uri("http://tempuri.org/"); 
        ICredentials credentials = CredentialCache.DefaultCredentials; 
        NetworkCredential credential = credentials.GetCredential(uri, "Basic"); 
        return credential; 
       } 
      } 
     } 
    } 

Ensuite, vous pouvez définir la propriété d'informations d'identification visionneuse de rapports à IReportServerCredentials

protected void Page_Load(object sender, EventArgs e) 
    { 
if (!Page.IsPostBack){ 
IReportServerCredentials iReportCredentials = new CustomReportCredentials("user", 
        "mypassword", "mydomain"); 
       ReportViewer1.ServerReport.ReportServerCredentials = iReportCredentials; 
} 
} 
+0

Merci, cela doit être ce que je manqué. Existe-t-il un moyen d'utiliser cette sécurité intégrée au lieu de devoir définir un nom d'utilisateur/mot de passe? – user842818