我们很难确定这些凭据对象的工作方式。事实上,他们可能无法按照我们期望的方式工作。以下是对当前问题的解释。
我们有2台服务器需要通过网络服务相互交谈。第一个(我们称之为Server01
)有一个运行为NetworkService帐户的Windows服务。另一个Server02
具有与IIS 6.0一起运行的ReportingServices。 Server01
上的Windows服务正在尝试使用Server02
ReportingServices WebService生成报告并通过电子邮件发送。
所以,这是我们到目前为止所做的尝试。
在运行时设置凭据(完全正常):
rs.Credentials = new NetworkCredentials("user", "pass", "domain");
现在,如果我们可以使用通用用户一切都没问题,但是......我们不被允许。因此,我们尝试使用DefaultCredetials或DefaultNetworkCredentials并将其传递给RS Webservice:
rs.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
或者:
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
无论哪种方式都行不通。我们总是从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服务器?
感谢阅读!
答案 0 :(得分:8)
您需要的所有详细信息都包含在这篇非常古老的文章中,
http://msdn.microsoft.com/en-us/library/ms998351.aspx
简而言之,当您发现排除此类问题时遇到困难时,您应该首先仔细查看ASP.NET模拟背后的技术细节。
答案 1 :(得分:0)
以下是您可以查看的一些内容: - 为报告服务设置SPN(服务主体名称);你可以在谷歌找到好的例子; - 允许委托(ClientCredentials.Windows.AllowImpersonationLevel)
答案 2 :(得分:0)
您是否无法向IIS进行身份验证或无法对SSRS进行身份验证?可能需要在SSRS中授予DOMAIN \ MachineName $帐户权限才能运行您尝试自动执行的报告。
SSRS通常可以很好地正确配置IIS,因此您不需要弄乱这些设置。我仔细检查了我的安装(这是SSRS 2005,在SSRS 2000中可能有不同的工作,你没有说你正在运行哪个版本),并且它设置为使用Windows身份验证并启用了模拟。这意味着IIS基本上应该只是验证您的凭据(验证正确的用户名/密码),而不是授权(确定该用户是否有权运行相关报告)。然后,IIS将凭据传递给SSRS,SSRS具有自己的设置,用于确定哪些帐户有权查看报告。
此外,您可以直接在SSRS中自动按计划发送报告,因此如果您的日程安排相当基本(即每天,每周等),您可能根本不需要Windows服务。