Это определенно ошибка в Cassini Dev.Похоже, этот метод возвращает неправильный токен: Request.GetUserToken()
.Код:
public override IntPtr GetUserToken()
{
return _host.GetProcessToken();
}
А здесь _host.GetProcessToken () - указатель на токен безопасности, принадлежащий пользователю, которому принадлежит процесс Cassini, это , а не токен, принадлежащийпользователь, который вошел в систему. Необходимо, чтобы объект NtlmAuth
передал маркер безопасности обратно в объект Request
, чтобы его можно было вернуть при вызове этого метода вместо токена хоста.Не совсем уверен, что лучший способ сделать это, но вы можете видеть в классе NtlmAuth
, токен безопасности приобретается здесь:
IntPtr phToken = IntPtr.Zero;
if (Interop.QuerySecurityContextToken(ref _securityContext, ref phToken) != 0)
{
return false;
}
phToken
это токен безопасности, но он должен получитьвернуться к объекту Request и не вызывать Interop.CloseHandle(phToken);
позже в этом методе, где он освобождает токен.Обратите внимание, что CloseHandle () должен в конечном итоге вызываться для токена, в противном случае новый будет выдаваться для каждого запроса, выполненного вошедшим в систему пользователем, но неиспользуемые никогда не будут освобождены.Одним из возможных мест для этого является объект Request
, который является подклассом SimpleWorkerRequest , и вы можете переопределить метод EndOfRequest для вызова метода CloseHandle () в маркере безопасности.