Неправильная идентификация Windows в Cassini-Dev при размещении в службе Windows - PullRequest
0 голосов
/ 02 декабря 2011

Я размещаю CassiniDev 4.0 в своей службе Windows, на которой запущен сайт конфигурации MVC 3.0 для моей службы.

У меня есть настройка web.config для использования проверки подлинности Windows.Когда я смотрю на HttpContext.User на веб-сайте, он показывает идентичность, под которой работает служба, а не личность пользователя, выполняющего запрос.User.AuthenticationType - это NTLM, что правильно, кстати, BTW.

Кажется, это довольно очевидно, что это ошибка, но я хотел, чтобы сообщество выполнило ее, чтобы проверить, есть ли какая-то конфигурация, которая мне не хватает.

Похоже, что это может быть вариация этого вопроса, опубликованная на прошлой неделе:

SecurityIdentifiers в NTLM-аутентификации Cassini-dev

1 Ответ

0 голосов
/ 08 декабря 2011

Это определенно ошибка в 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 () в маркере безопасности.

...