2010-04-14 4 views
3

J'utilise un contrôle de visionneuse de rapports dans une application Web ASP.net. L'application s'exécute dans l'identité du pool d'applications (impersonate = "false"), de sorte qu'elle a le droit de lire/écrire la base de données. Mais pour le contrôle du visualiseur de rapports, j'ai besoin d'emprunter l'identité de l'utilisateur actuellement connecté. Jusqu'à présent, j'ai seulement trouvé des informations sur la définition de l'emprunt d'identité à true pour l'ensemble de l'application, de sorte que le visualiseur de rapports est également emprunté. Ou il existe des informations sur la façon de créer ses propres informations d'identification transmises à l'utilisateur (ce n'est donc pas l'utilisateur actuellement connecté).Usurpation d'identité Asp.net Report Viewer

Est-ce que quelqu'un sait comment usurper l'identité de l'utilisateur actuel uniquement pour le visualiseur de rapports, mais pas pour l'ensemble de l'application?

Répondre

3

Si je vous comprends bien, vous devez implémenter IReportServerCredentials, voici un exemple ive utilisé dans le passé

using System; 
using System.Configuration; 
using System.Web; 
using Microsoft.Reporting.WebForms; 
using System.Security.Principal; 
using System.Net; 

[Serializable] 
public sealed class ReportServerNetworkCredentials : IReportServerCredentials 
{ 
#region IReportServerCredentials Members 

private string username, password; 

public ReportServerNetworkCredentials(string username, string password) 
{ 
    this.username = username; 
    this.password = password; 
} 

public bool GetFormsCredentials(out System.Net.Cookie authCookie, out string userName, out string password, out string authority) 
{ 
    //throw new NotImplementedException(); 
    userName = password = authority = null; 

    // The cookie name is specified in the <forms> element in Web.config (.ASPXAUTH by default) 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[".ASPXAUTH"]; 

    if (cookie == null) 
    { 
     authCookie = null; 
     return false; 
    } 

    Cookie netCookie = new Cookie(cookie.Name, cookie.Value); 
    if (cookie.Domain == null) 
    { 
     netCookie.Domain = HttpContext.Current.Request.ServerVariables["SERVER_NAME"].ToUpper(); 
    } 

    netCookie.Expires = cookie.Expires; 
    netCookie.Path = cookie.Path; 
    netCookie.Secure = cookie.Secure; 
    authCookie = netCookie; 
    return true; 
} 

public WindowsIdentity ImpersonationUser 
{ 
    get 
    { 
     return null; 
    } 
} 

public System.Net.ICredentials NetworkCredentials 
{ 
    get 
    { 
     return new System.Net.NetworkCredential(this.username, this.password); 
    } 
} 

#endregion 
} 

Et puis sur la page ASPX avec le col de visionneuse de rapports dans vos informations d'identification, etc.

ReportViewer1.ServerReport.ReportServerCredentials = new ReportServerNetworkCredentials(username, password); 
    ReportViewer1.ServerReport.ReportServerUrl = new Uri("http://youreportserver/ReportServer"); 
    ReportViewer1.ServerReport.ReportPath = reportPath; 
    //etc 

Cela vous permettra de passer n'importe quel nom d'utilisateur et vous passer. Cela fonctionne sur SSRS 08/SQL 08 et id imagine 05 aussi, cela utilise des formulaires auth.

J'espère que cela aide et que j'ai bien compris votre question.


Edit: Oui simplement récupérer le nom d'utilisateur et mot de passe où que vous les stockez (etc membres) et dans le passer dans mon exemple selon. Le nom d'utilisateur et le mot de passe doivent exister dans le serveur de rapports. Cependant, si vous avez vraiment besoin de comptes pour chaque utilisateur, créez un compte sur le serveur de rapports lorsque vous créez le compte dans l'application elle-même. Vous pouvez le faire via les services Web que SSRS expose, voir ici. Si le site est déjà utilisé, vous pouvez facilement parcourir tous vos utilisateurs et créer un compte via les services Web SSRS.

Cependant, êtes-vous sûr de vouloir créer un compte-rendu pour chaque utilisateur? Vous pouvez créer un compte pour chaque rôle dans l'application si vos raisons sont plus de droits d'accès que la journalisation.

+0

Comme je l'ai écrit, je veux emprunter l'identité de l'utilisateur actuellement connecté. Comment les transmettre aux informations d'identification personnalisées "new ReportServerNetworkCredentials (loggedOnUserName ?, loggedOnPassword?)" – Chris

Questions connexes