首先,此问题仅在.Net framework 4.5上发生。
我一直在处理这个没有连接到第三方Web服务的问题 第三方Web服务是Hyland的Unity API之一。这是我们的用户一直在抱怨的问题。 当我们尝试连接到他们的Web服务Unity API时,我们遇到了“拒绝访问”。堆栈跟踪显示“安全访问被拒绝”。我们使用域身份验证进行连接。我们在IIS中设置了使用Windows身份验证和匿名。这很好。
一旦管理员帐户(即具有管理员权限的人员成功建立连接),它就可以为其他用户正常工作。此管理员和其他所有人都设置为使用域身份验证,但一个是管理员而另一个不是。如果管理员拨打第一个电话,那么一切都很好。 假设第一个登录的人不是管理员,与OnBase的连接失败,并且包括设置为管理员的人在内的所有人都失败了。此时,他们必须在服务器上执行IIS重置,并首先让管理员登录以正确设置。
我对此做了一些研究。为什么使用匿名身份验证?所以我决定关闭IIS中的匿名和一些webconfig设置来拒绝和允许。 我遇到了有关客户端方案Negotiate的问题,并且标题除了其他内容之外。所以我开始使用
<authenticationmode = "Windows" />
<deny users> *?
这没有帮助。我不知道这个谈判在哪里进来。所以一路跟着它,并在服务中遇到了这个电话。 callerWindowsIdentity具有身份验证Type ='Negotiate'。这个Impersonate()实际上做了什么?它是否使用IUSR帐户或应用程序池标识?
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetSessionDomainAuthentication()
{
var result = string.Empty;
var callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
if (callerWindowsIdentity != null)
{
using (callerWindowsIdentity.Impersonate())
{
// Access a file as the caller.
var myapp = Application.Connect(Environment.UserName)
if (myapp != null)
{
result = myapp.SessionID;
}
}
}
return result;
}
冒充就是问题所在。我正在阅读如果启用模拟,则始终模拟IIS为ISAPI扩展提供的访问令牌。该令牌可以是先前经过身份验证的用户。 这可能是第一次管理员登录然后对每个人都有好处的原因。如果当前用户没有足够的权限,模拟是否会重用令牌 我无法理解这一点。有人可以对模仿有所了解。它是否适用于我的场景。