使用DefaultCredentials和DefaultNetworkCredentials

时间:2009-06-29 14:29:06

标签: web-services reporting-services credentials defaultnetworkcredentials

我们很难确定这些凭据对象的工作方式。事实上,他们可能无法按照我们期望的方式工作。以下是对当前问题的解释。

我们有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访问权限。但事实并非如此。或者至少,某些东西设置不正确,无法正确验证。

所以,这里有一些问题:

  1. 我们在某处读到了“冒充用户”的问题,我们是否需要在 Windows服务中设置此位置?

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

  3. 感谢阅读!

3 个答案:

答案 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服务。