我正在尝试获取一个 API 以将客户端凭据传递到数据库(在不同的服务器上),但遇到的东西对我来说很像 Kerberos 双跳问题,但是系统人员说 Kerberos 委派已设置适当地在有问题的服务器上。下面是我为测试它而编写的一个方法,底部是我通过 NTLM 将自己的凭据发送到 API 时在 Postman 中得到的响应正文。在发送我有权访问的另一个帐户的凭据时,我得到了类似的响应。当发送我知道是错误的凭据时,IIS 会停止我的请求并以 401 响应而不将请求发送到 API;这是预期和要求的。
除了 Kerberos 双跳之外,还有什么可能导致此问题?我的模拟实施是否存在缺陷?我无权访问任何有问题的服务器,但如果需要,我可以提供控制器遇到的整个丑陋异常。
/// <summary>
/// This endpoint should not support PUT. This method is simply a means by which to test impersonation
/// </summary>
[HttpPut]
public IActionResult PutMethod()
{
var bogusPutResult = new ImpersonationResult();
if (!(this.User.Identity is WindowsIdentity user)) return Problem("Cannot authenticate user");
var row1 = _myDbContext.MyTable.Find(1);
bogusPutResult.BeforeImpersonation = $"{WindowsIdentity.GetCurrent().Name} got a row with value {row1.Value}";
WindowsIdentity.RunImpersonated(user.AccessToken, () =>
{
string message;
try
{
var row2 = _myDbContext.MyTable.Find(2); // All domain users have SELECT access
message = $" got a row with value {row2.Value}";
}
catch (Exception e)
{
message = $" ate this: {e.GetType()}--{e.Message}";
}
bogusPutResult.DuringImpersonation = $"{WindowsIdentity.GetCurrent().Name} {message}";
});
bogusPutResult.AfterImpersonation = WindowsIdentity.GetCurrent().Name;
return Ok(bogusPutResult);
}
API返回的JSON...
{
"BeforeImpersonation": "MYDOMAIN\\srv-apiserviceaccount got a row with value 34 ",
"DuringImpersonation": "MYDOMAIN\\finglixon ate this: Microsoft.Data.SqlClient.SqlException--Login failed for user 'NT AUTHORITY\\ANONYMOUS LOGON'.",
"AfterImpersonation": "MYDOMAIN\\srv-apiserviceaccount"
}