使用双跳 Windows 身份验证连接到 Microsoft Analysis Services 多维数据集
Posted
技术标签:
【中文标题】使用双跳 Windows 身份验证连接到 Microsoft Analysis Services 多维数据集【英文标题】:Connecting to Microsoft Analysis Services cube with double hop windows authentication 【发布时间】:2010-08-10 05:13:13 【问题描述】:我正在尝试对 Web 服务器上的 .Net 应用程序的用户强制执行 Windows 身份验证,以访问 SSAS 上 Microsoft Analysis Services 数据库上的多维数据集,并且只是为了让它工作而发疯!
我在 web.config 中使用<identity impersonate="true" />
。在 IIS 中关闭匿名访问并选择集成 Windows 身份验证。 appPool 以指定的身份运行;在 Active Directory 中已被授予“帐户受信任委派”的单独 Windows 帐户。我还让网络人员在 Web 服务器上为这个身份创建和注册一个 SPN。尝试访问 .Net 应用程序的用户没有在其 AD 帐户上选择“帐户敏感且无法委派”。
如果用户从 Web 服务器本地访问 .Net 应用程序,它工作正常,但是当从客户端的 PC 访问 .Net 应用程序时,他们会收到错误:“传输层遇到错误”“对等方过早地关闭了连接”。使用 SQL Profiler 进行跟踪,我可以看到尝试验证失败的 NTUserName 是匿名登录。
为什么不委托用户的身份验证??
解决方案:
如here 所述,在 SSAS 服务器上为 OLAP 服务注册 SPN 已修复此问题!即 Setspn.exe -A MSOLAPSvc.3/Servername mydomain\theuser.
【问题讨论】:
【参考方案1】:听起来您的 Web 应用程序并没有真正获取他们的身份和/或将其传递给 .NET 应用程序。你可以设置一个测试页面来验证它是否正在获取他们的 Windows ID?
编辑:这篇文章可能会有所帮助:http://www.eggheadcafe.com/articles/20050703.asp
尝试设置一个空白的 debug.aspx 页面,在代码后面的代码中说:
private void Page_Load(object sender, System.EventArgs e)
Response.Write("Page Identity: " + Page.User.Identity.Name);
Response.Write("Windows Identity: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
Response.Write("Thread Identity: " + System.Threading.Thread.CurrentPrincipal.Identity.Name);
从客户端 PC 上点击该页面,这将帮助您了解该网页的实际运行情况。该文章可能会帮助您解决如何解决问题。
【讨论】:
我已经运行了 SQL Profiler 跟踪,当本地访问服务器 A 时,正确的用户身份被传递给服务器 B。 知道了。我的意思是你可以在服务器 C 上设置一个测试页面来查看用户是否得到了正确的身份验证?此外,将它们称为 SSAS 服务器、应用程序服务器和 Web 服务器会更容易。 :) 抱歉,服务器 C 并不是真正的服务器,我指的是客户端的 PC。服务器 A 是 Web 服务器,服务器 B 是 SSAS。我将编辑原始问题:) 谢谢,现在更清楚了。我猜问题出在您的 web.config 或 IIS 设置中。查看编辑。 很好的链接。我可以看到为什么网页测试会有用,但我不想在该服务器上设置 iis。 Web 应用程序可以访问与 SSAS 相同的服务器上的 SQL Server 数据库并运行配置文件跟踪 - 身份是正确的。所以也许只是一个立方体特定的问题?我使用失败的连接字符串是“Provider=MSOLAP; Initial Catalog=xxx; Data Source=yyy;SSPI= Kerberos;”以上是关于使用双跳 Windows 身份验证连接到 Microsoft Analysis Services 多维数据集的主要内容,如果未能解决你的问题,请参考以下文章
在IIS7中通过PHP连接到SQL SERVER 2008(使用Windows身份验证)?
使用 Windows 身份验证连接到 sql db 的 Powershell 脚本