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”属性
第二个实例中的第二个请求有
所以现在的问题是,为什么 .NET 8 不发出第二个“krbtgt”请求?
原因可能是:
总而言之:请检查匿名身份验证、您的 AppPool 身份和您的连接 URL FQDN 是否与工作应用程序相同。