我们很难确定这些凭证对象的工作方式.事实上,他们可能无法按照我们期望的方式工作.这是对当前问题的解释.
我们有2台服务器需要通过webservices相互通信.第一个(让我们称之为Server01
)有一个Windows服务作为NetworkService帐户运行.另一个Server02
具有与IIS 6.0一起运行的ReportingServices.Windows Service on Server01
正在尝试使用Server02
ReportingServices WebService生成报告并通过电子邮件发送它们.
所以,这是我们到目前为止所做的尝试.
在运行时设置凭据(这完全正常):
rs.Credentials = new NetworkCredentials("user", "pass", "domain");
Run Code Online (Sandbox Code Playgroud)
现在,如果我们可以使用通用用户一切都没问题,但是......我们不被允许.因此,我们尝试使用DefaultCredetials或DefaultNetworkCredentials并将其传递给RS Webservice:
rs.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
Run Code Online (Sandbox Code Playgroud)
要么:
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Run Code Online (Sandbox Code Playgroud)
无论哪种方式都行不通.我们总是从IIS获得401 Unauthrorized.现在,我们知道如果我们想要访问记录为NetworkService的资源,我们需要将其授予DOMAIN\MachineName$
(http://msdn.microsoft.com/en-us/library/ms998320.aspx):
授予对远程SQL Server的访问权限
如果要访问同一域(或受信任域)中的另一台服务器上的数据库,则使用网络服务帐户的网络凭据对数据库进行身份验证.网络服务帐户的凭据的格式为DomainName\AspNetServer $,其中DomainName是ASP.NET服务器的域,AspNetServer是您的Web服务器名称.
例如,如果ASP.NET应用程序在域CONTOSO中名为SVR1的服务器上运行,则SQL Server将看到CONTOSO\SVR1 $的数据库访问请求.
我们假设以相同的方式授予IIS访问权限.但事实并非如此.或者至少,没有正确设置某些内容以使其正确进行身份验证.
所以,这里有一些问题:
我们在某个地方读过"模仿用户",我们是否需要在Windows服务中的某处设置?
是否可以将对NetworkService内置帐户的访问权限授予远程IIS服务器?
谢谢阅读!
web-services credentials defaultnetworkcredentials reporting-services