Zo werkte het goed, zo stopte het ermee en kregen we een 401 error, forbidden. En toen begon de zoektocht naar authenticatie voor de reportviewer.
Reporting Services 2005 with ASP.NET forms authentication
Wat we willen is een applicatie met form-authentication. We houden zelf de useraccounts bij in de database. Om rapportages weer te geven willen we gebruik maken van Reporting Services 2005. Zowel de applicatie als de database als reporting services draaien op dezelfde server. We willen echter als 'UserX' de reporting server benaderen, terwijl de applicatie onder 'Network Service' draait (DefaultAppPool) en we via Forms-authentication ingelogd zijn op onze applicatie. Hoe doen we dat?
Uiteindelijk blijkt dat de enige manier om credentials aan de reportviewer mee te geven een implementatie van IReportServerCredentials is. Zoeken op het internet levert een aantal voorbeelden in C# op, maar geen enkele in VB.NET. Na wat stoeien kom ik op deze implementatie:
Code:
Imports Microsoft.Reporting.Webforms
Imports System.Security.Principal
Imports System.Net
Public Class myReportServerCredentials
Implements IReportServerCredentials
Private mAuthCookie As Cookie
Private _UserName As String
Private _Password As String
Private _Domain As String
Public Sub New(ByVal UserName As String, _
ByVal Password As String, _
ByVal Domain As String)
_UserName = UserName
_Password = Password
_Domain = Domain
End Sub
Public ReadOnly Property ImpersonationUser() As WindowsIdentity
Implements IReportServerCredentials.ImpersonationUser
Get
Return Nothing
End Get
End Property
ReadOnly Property NetworkCredentials() As ICredentials _
Implements IReportServerCredentials.NetworkCredentials
Get
Return New System.Net.NetworkCredential(_UserName, _Password, _Domain)
End Get
End Property
Function GetFormsCredentials(ByRef authCookie As Cookie, _
ByRef user As String, _
ByRef password As String, _
ByRef authority As String) As Boolean _
Implements IReportServerCredentials.GetFormsCredentials
authCookie = Nothing
user = Nothing
password = Nothing
Return False
End Function
End Class
Om deze class aan te roepen en te gebruiken binnen de reportviewer control gebruik ik de volgende code:
rv.ServerReport.ReportServerCredentials = New myReportServerCredentials("UserX", "password", "Domein").
Nog steeds krijg ik een 401-error. Dit komt omdat de virtual directory 'ReportServer' standaard ingesteld staat op 'Integrated security'. Door deze op 'basic' te zetten draait de reportviewer weer goed en wordt de virtual directory benaderd als UserX.