调用应用程序从 .NET 4.7 升级后,Kerberos 票证具有错误的模拟级别

问题描述 投票:0回答:1

Web 应用程序“A”正在调用 Web API“B”,而 Web API“B”正在调用 Sharepoint 站点“C”。全部通过 Windows 身份验证进行身份验证。

当“A”针对 .NET 4.7.2 时,它可以工作。 Sharepoint 站点“C”正确验证了用户身份,并且 kerberos 票证显示“模拟级别:委派”。

当“A”针对 .NET 8(也尝试使用 .NET 5)并且 IISSettings 移至

startup.cs
时,kerberos 票证显示“模拟级别:模拟”并且 Sharepoint 站点“C”抛出 http 401 (因为没有用户,所以请求是匿名的)。

因此在.NET 8场景中,Windows身份验证在“A”中工作。对 Web API“B”的模拟调用有效,但模拟级别错误。

我还尝试使用以下代码创建一个简单的控制台应用程序。请注意,URL 与之前相同,即对 Web API“B”的调用。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://b.domain.com/resource");
request.ImpersonationLevel = TokenImpersonationLevel.Delegation;
request.UseDefaultCredentials = true;

try
{
    using (var response = (HttpWebResponse)request.GetResponse())
    using (var reader = new StreamReader(response.GetResponseStream()))
    {
        var c = reader.ReadToEnd();
        Console.WriteLine(c);
    }
}
catch (WebException e)
{
    Console.WriteLine(e.Message);
}

再次,针对 .NET 5 并使用 IISExpress 在本地运行会导致 http 错误 401,但针对 .NET 4.7.2,它可以工作,并且我可以获得用户特定的数据。

其他注意事项:在测试 .net“A”的目标版本的更改时,我重复使用相同的 appool IIS 站点,这意味着它们对 AppPool 帐户、SPN、Windows 身份验证等具有相同的配置。看来唯一改变的是 .net 版本目标。

可能是什么问题?关于下一步尝试什么有什么建议吗?

更新

我在托管“A”的第一台服务器上进行了一些网络嗅探,发现了一些有趣的东西。

  • 对于 .NET 8 的非工作请求,使用以下标志发出一个 kerberos 请求:(可转发、可更新、规范化)

  • 对于 .NET Framework 的工作请求,会发出两个 kerberos 请求,第一个请求带有这些标志(可转发、可更新、规范化) 第二个带有这些标志(可转发、转发、可更新、规范化、可更新)

两个实例中的第一个 kerberos 请求都有 2 个“SNameString”属性

  • “HTTP”
  • “b.domain.com”(Web API“B”的 URL)

第二个实例中的第二个请求有

  • “krbtgt”
  • “domain.com”(B 和许多其他事物所属的更广泛的域)

所以现在的问题是,为什么 .NET 8 不发出第二个“krbtgt”请求?

.net .net-core kerberos windows-authentication kerberos-delegation
1个回答
0
投票

原因可能是:

  • 在主机 B 上,IIS 上的应用程序可能启用了“匿名身份验证”。即使选中 Windows 身份验证,“匿名身份验证”也会优先。另请检查协商协议是否位于 Windows 身份验证提供程序的顶部。 如果问题仍然存在,请检查以下内容:
  • 较新的 IIS 应用程序是否以域用户或内置用户的身份分配给具有应用程序池标识的应用程序池? 可以使用 HostA 和 HostB 的命令检查现有委托,如下所示 setspn-L 由于您的工作应用程序具有域范围的票证,因此分配给其 AppPool 身份的域用户应在 AD 中将委派委托定义为:
  • 转到 Active Directory 用户和计算机。
  • 单击用户。 搜索您的域用户帐户(分配给工作应用程序的 AppPool 身份的域用户)并转到其属性。
  • 选择委派选项卡并验证(无约束委派)“信任此帐户来委派任何服务”。

总而言之:请检查匿名身份验证、您的 AppPool 身份和您的连接 URL FQDN 是否与工作应用程序相同。

参考:https://techcommunity.microsoft.com/t5/iis-support-blog/setting-up-kerberos-authentication-for-a-website-in-iis/ba-p/347882

© www.soinside.com 2019 - 2024. All rights reserved.