我遇到这样一种情况,连接到我的Web服务(存在于另一台服务器上)的客户端必须访问SQL Server数据库和SSAS服务器。
访问SQL Server和SSAS多维数据集时,它必须使用正在调用服务的客户端的凭据。
为此我做
var winId = HttpContext.Current.User.Identity as WindowsIdentity;
var ctx = winId.Impersonate();
//访问数据库/SSAS
ctx.Undo();
在我的服务中,在访问SQL Server数据库时工作正常。
但是,当我访问SSAS服务器时,会得到
“连接超时或丢失”
有很多类似的帖子
http://denglishbi.wordpress.com/2009/03/31/windows-server-2008-kerberos-bug-%E2%80%93-transport-connection-issues-with-ssas-data/
http://sqlblogcasts.com/blogs/drjohn/archive/2009/03/28/kerberos-kills-large-mdx-queries-on-windows-server-2008-ssas.aspx
在此,但我正在使用Windows Server 2008 R2
我的服务所在的位置,因此这应该不是问题,因为此错误应该已经由Microsoft修复。
任何有关如何最好地诊断此问题的信息将不胜感激。
为了明确说明,SSAS服务器确实具有SPN。该操作实际上只在某一时刻起作用,但现在已停止。似乎没有任何重复的SPN或任何东西的迹象。
有趣的是,它在一台SSAS服务器上间歇工作,但似乎一直在另一台SSAS服务器上工作。
如本文档所述,它们都已命名SPN。
https://support.pyramidanalytics.com/entries/22056243-Configuring-Kerberos-Delegation-for-Named-Instances-of-SSAS-with-Active-Directory-and-additional-pro
最佳答案
我的生产环境是非常大的公司Active Directory网络上的负载平衡(并且负载很重)。以下经过大量测试,最终确定了有效的设置。
通过此设置,我的Web服务可以访问SSAS,SQL Server以及使用Windows Kerboros身份验证的其他服务,并且所有查询均在用户的凭据下正确执行。
我的设置与您的设置不同之处在于,在IIS级别启用了ASP.NET模拟。我在模仿代码时遇到了麻烦,这就是您要尝试做的事情。如果您可以使用代码级模拟功能来处理您的工作流程,那么我非常有兴趣看到您发布更新。
忘了提。我的服务在MVC应用程序中,我将全局过滤器应用于所有Action方法,以强制应用程序对所有连接进行身份验证。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
并在我的web.config system.web部分中
<authentication mode="Windows" />
<identity impersonate="true" />