c # Выдача себя за пользователя после аутентификации форм

До сегодняшнего дня я использовал оконную аутентификацию для своей корпоративной сети (встроенной в asp mvc 3.0). Однако из-за срочности необходимости логирования пользователей мне пришлось перейти к формам аутентификации.

Теперь все в порядке, кроме одной функции, которую я использовал для исследования каталога на сервере. В зависимости от прав пользователя пользователь мог читать некоторые каталоги и файлы. Это моя функция:

public static MvcHtmlString Explore()
    {
        WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity;

        MvcHtmlString s = null;
        using (System.Security.Principal.WindowsImpersonationContext context = System.Security.Principal.WindowsIdentity.Impersonate(id.Token))
        {
            try
            {
                s = new MvcHtmlString(Explore(documentsRootFolder).ToString());
            }
            catch (Exception e)
            {
                HttpContext.Current.Response.Write(e.Message+"<br/>");
                HttpContext.Current.Response.Write(e.StackTrace);
            }
        }
        return s;
    }

    private static StringBuilder Explore(string path)
    {

        StringBuilder writer = new StringBuilder();
        writer.Append("<ul>");
        try
        {
            foreach (var a in System.IO.Directory.GetDirectories(path))
            {
                writer.AppendFormat("<li>{0}</li>", a.Replace((path.EndsWith(@"\") ? path : path+@"\"), string.Empty));
                writer.Append(Explore(a));

            }

            foreach (var a in System.IO.Directory.GetFiles(path))
            {
                string url = a.Replace(documentsRootFolder, string.Empty).Replace(@"\", "/");
                string friendlyName = a.Replace((path.EndsWith(@"\") ? path : path + @"\"), string.Empty);
                writer.AppendFormat("<li><a href=\"Open?path={0}\">{1}</a></li>", url, friendlyName);
            }
        }
        catch { }
        writer.Append("</ul>");
        return writer;
    }

Конечно, с аутентификацией форм я не могу получить идентификатор Windows от пользователя HttpContext. Как я теперь могу читать каталоги и файлы?

P.S: Я попытался использовать advapi32.dll, чтобы получить идентификатор пользователя Windows. Однако после входа в систему невозможно выйти, не закрыв браузер (ssi). Вот почему я ищу другое решение. Можно ли получить токен идентификатора Windows без входа в систему?

Спасибо


person user1845394    schedule 15.05.2014    source источник
comment
Если вам нужно автоматически отключать пользователей из-за проблем с безопасностью в приложении интрасети, думали ли вы о том, чтобы попросить своих ИТ-администраторов вместо этого принудительно блокировать сеансы Windows автоматически, поскольку это, вероятно, приведет к той же цели.   -  person a-h    schedule 15.05.2014
comment
нет, я хочу разрешить пользователям входить в систему, когда они хотят (например, входить с другой учетной записью ...)   -  person user1845394    schedule 15.05.2014


Ответы (1)


Наверное, небезопасно и не рекомендуется. Но вы можете сохранить имя пользователя и пароль в сеансе var или что-то в этом роде. Затем при необходимости используйте олицетворение через этот класс.

using(new Impersonation("username","domain","password"))
{
  s = new MvcHtmlString(Explore(documentsRootFolder).ToString());
}
person mxmissile    schedule 15.05.2014
comment
Сохранение учетных данных пользователя в Session var, вероятно, вызывает сомнения. - person mxmissile; 15.05.2014
comment
Если я сохраняю в сеансе объект Impersantion и удаляю его при выходе пользователя из системы, это безопаснее? - person user1845394; 15.05.2014
comment
Нет, не делай этого. Используйте класс Impersonation только тогда, когда вам действительно нужно выдавать себя за другое лицо. - person mxmissile; 15.05.2014