我在我的一个asp项目中有一个函数,该项目命中服务器以获取报告并返回它的字节。到目前为止,我一直在使用我的域凭据,但希望在服务器本身使用sql server身份验证,但无论如何我都会收到401错误。
public byte[] GetReportBytes(string report, string parameterList)
{
string strReportUser = "sqlserveruser";
string strReportUserPW = "password";
//not used with sql?
string strReportUserDomain = "domain";
string sTargetURL = "reportserver?" +
"/folder/" + report + "&rs:Command=Render&rs:format=PDF&" + parameterList;
HttpWebRequest req =
(HttpWebRequest)WebRequest.Create(sTargetURL);
req.PreAuthenticate = true;
req.Credentials = new System.Net.NetworkCredential(
strReportUser,
strReportUserPW);
HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse();
Stream fStream = HttpWResp.GetResponseStream();
byte[] fileBytes = ReadFully(fStream);
return fileBytes;
}
这可能吗?
答案 0 :(得分:3)
我认为您不能使用" sql server身份验证"对Reporting Services网址进行身份验证(至少是开箱即用)。 (您的数据源可以,但这里我们讨论的是SSRS网址)。 " Sql Server身份验证"未列为Authentication with the Report Server
支持的方法之一如果你想要Configure Custom or Forms Authentication on the Report Server
,你可以您也可以Configure Basic Authentication on the Report Server,但即使这样也不会使用" sql server authentication" - 请求将传递给本地安全机构,最终可能会对域凭据进行身份验证。
在您的情况下,看起来您的Web应用程序本质上充当代理(在某种意义上) - 它将报表作为表示pdf的字节数组,然后返回,以便客户端浏览器永远不会直接与SSRS沟通。
因此,我建议只保留Windows身份验证,并设置SSRS权限,以便委派使用asp.net应用程序池的标识(并保持该应用程序池特定于您的特定应用程序)。这样,您就不需要在Web应用程序代码或配置中存储任何用户名或密码。
要实现此目的,您还需要至少使用内容浏览器"设置应用程序池标识用户。 SSRS中的权限。除非您的iis实例与报告服务服务器位于同一台计算机上,否则您将需要创建一个受限权限域用户或镜像本地帐户来设置为您的应用程序池标识。 (或者,如果您确实想要使用内置的IIS ApplicationPoolIdentity
用户,则可以在计算机帐户上授予SSRS权限(例如<domain>\<machinename>$
)但是,这可能是不可取的,因为它授予了很多更广泛地访问哪些服务可以访问SSRS)。
如果您的Web应用程序正在使用表单身份验证,那么只需执行以下操作即可:
req.Credentials = System.Net.CredentialCache.DefaultCredentials;
但是,如果您对网站使用Windows身份验证,则上面(如果内存正确提供)将改为传递当前登录的Windows用户的身份,而不是应用程序池身份,这可能不是什么你想要的。
使用SSRS网络服务
如果您愿意使用SSRS Web服务并使用&#34;添加服务参考&#34;生成肥皂客户端。在您的项目中(您的示例代码不做),您可以通过执行以下操作使身份验证使用应用程序池标识:
var soapClient = new ReportExecutionServiceSoapClient("ReportExecutionServiceSoap");
soapClient.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Delegation;
我已经有一段时间了,但是在使用&#34;服务参考&#34;您还需要确保WCF绑定正确。以下是我认为上次为我工作的内容:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ReportExecutionServiceSoap" allowCookies="true" maxReceivedMessageSize="5242880">
<security mode="Transport">
<transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://theSsrsServer/ReportServer/ReportExecution2005.asmx" binding="basicHttpBinding" bindingConfiguration="ReportExecutionServiceSoap" contract="ReportService.ReportExecutionServiceSoap" name="ReportExecutionServiceSoap" />
</client>
答案 1 :(得分:0)
不,这是不可能的。使用Windows凭证。