我们很难弄清楚这些凭证对象是如何工作的。事实上,它们可能不会按照我们期望的方式工作。这是对当前问题的解释。

我们有 2 台服务器需要通过 Web 服务相互通信。第一个(我们称之为 Server01)有一个作为 NetworkService 帐户运行的 Windows 服务。另一个 Server02 具有与 IIS 6.0 一起运行的 ReportingServices。Windows 服务开启 Server01 正在尝试使用 Server02 ReportingServices WebService 用于生成报告并通过电子邮件发送。

所以,这就是我们到目前为止所做的尝试。

在运行时设置凭据(这工作得很好):

 rs.Credentials = new NetworkCredentials("user", "pass", "domain");

现在,如果我们可以使用通用用户,一切都会很好,但是......我们不被允许这样做。因此,我们尝试使用 DefaultCredentials 或 DefaultNetworkCredentials 并将其传递给 RS Webservice:

rs.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials

或者:

rs.Credentials = System.Net.CredentialCache.DefaultCredentials

无论哪种方式都行不通。我们总是从 IIS 收到 401 Unauthorized。现在,我们知道,如果我们想要授予对记录为 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 相同的方式授予访问权限是可行的。然而,事实并非如此。或者至少,某些内容未正确设置,无法正确进行身份验证。

那么,这里有一些问题:

  1. 我们在某处读过有关“模拟用户”的内容,我们是否需要在 视窗服务 ?

  2. 是否可以向远程 IIS 服务器授予对 NetworkService 内置帐户的访问权限?

谢谢阅读!

有帮助吗?

解决方案

您需要的所有详细信息都包含在这篇非常古老的文章中,

http://msdn.microsoft.com/en-us/library/ms998351.aspx

简而言之,当您发现解决此类问题令人困惑时,您应该首先仔细查看 ASP.NET 模拟背后的技术细节。

其他提示

您可以检查以下一些内容:- 为报告服务设置 SPN(服务主体名称);你可以在谷歌中找到很好的例子;- 允许委派 (ClientCredentials.Windows.AllowImpersonationLevel)

问题是您无法通过 IIS 进行身份验证,还是无法通过 SSRS 进行身份验证?可能需要在 SSRS 中授予 DOMAIN\MachineName$ 帐户权限才能运行您尝试自动化的报告。

SSRS 通常可以很好地正确配置 IIS,因此您不需要弄乱这些设置。我仔细检查了我的安装(SSRS 2005,SSRS 2000 中的工作方式可能有所不同,并且您没有说明您正在运行哪个版本),并且它设置为使用 Windows 身份验证并启用了模拟。这意味着 IIS 基本上应该只是验证您的凭据(验证正确的用户名/密码),而不是授权(确定该用户是否有权运行相关报告)。然后,IIS 将凭据传递给 SSRS,SSRS 有自己的设置来确定哪些帐户有权查看报告。

此外,您可以直接在 SSRS 中自动按计划发送报告,因此如果您的计划相当基本(即每天、每周等),您可能根本不需要 Windows 服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top