Можно ли использовать атрибут, чтобы заставить .net выдавать себя за другого пользователя? - PullRequest
3 голосов
/ 08 июня 2010

Я знаком с олицетворением учетной записи в .net с помощью:

dim myIdentity as WindowsIdentity = someIdentity  
using ctx as WindowsImpersonationContext = myIdentity.Impersonate()  
    doStuff()  
end using

Можно ли определить атрибут .net, чтобы я мог написать что-то вроде:

< runAsUser(someIdentity) > public sub doStuff()

а затем .net Framework всегда олицетворяет себя при запуске метода doStuff()?

Update Хорошо, мне сказали, что это может быть невозможно, поскольку аргументы конструктора атрибута должны бытьконстанты, которые исключают передачу идентификатора пользователя.

Позвольте мне задать вопрос немного иначе: предположим, что существует функция getUserWindowsIdentity(), которая возвращает идентификатор, связанный с вошедшим в систему пользователем.

Могу ли я затем использовать < runAsLoggedInUser) > public sub doStuff() >, чтобы инфраструктура всегда олицетворяла идентификатор пользователя, возвращаемый getUserWindowsIdentity при запуске метода doStuff()?

Ответы [ 5 ]

2 голосов
/ 08 июня 2010

Нет, такой магии не существует в .NET Framework. Вы должны написать код самостоятельно, используя Reflection для чтения атрибута. Этот код будет очень похож на код, который у вас уже есть, только медленнее и с кодом для чтения добавленного атрибута.

1 голос
/ 09 июня 2010

Как уже отвечали другие, вы можете создать Атрибут, который будет выполнять «работу», но явно не указано, что нет никаких пользовательских атрибутов, которые вы можете создать, чтобы компоненты времени выполнения или фреймворка выполнялись в от имени. Таким образом, вы можете создать такой атрибут, как:

public class RunAsUserAttribute : Attribute
{
    // implement some attribute functionality here
}

и затем вы можете использовать этот атрибут в методе или классе:

[RunAsUser]
public void DoStuff()
{
    // do some stuff as the impersonated user
} 

Какой компонент будет вызывать функциональность в классе RunAsUserAttribute? Вы можете поместить этот вид функциональности в динамический прокси-сервер, как рекомендует soccerdad. Это один из способов решения проблемы.

Приветствие.

1 голос
/ 09 июня 2010

Если вы управляете: а) кодом, который вызывает метод doStuff (), или б) средствами, с помощью которых вызывающая функция doStuff () получает ссылку на объект / класс, в котором реализована doStuff (), тогда вы может выполнить то, что вы ищете. Пункт б) является предпочтительным.

Если это возможно, посмотрите на динамические прокси - http://www.castleproject.org/dynamicproxy/index.html. Вместо возврата фактического экземпляра рассматриваемого объекта / класса, верните прокси для экземпляра. Когда вызывающая сторона вызывает метод, прокси видит его первым. В реализации прокси найдите свой атрибут в вызываемом методе и, если он найден, инициируйте олицетворение.

Донни

1 голос
/ 08 июня 2010

Я вполне уверен, что это не может быть сделано.Вы можете смоделировать его с помощью PostSharp (или аналогичного).

Параметры, передаваемые конструкторам Attribute, должны быть константами , то есть они не могут быть ссылочнымиТипы на всех.Я бы поставил под сомнение случай использования, когда блок кода должен всегда выполняться с одинаковыми жестко закодированными учетными данными.

0 голосов
/ 08 июня 2010

Я не эксперт, поэтому я признаю, что вы не можете сделать это так, как вы предлагали, но вы могли бы написать код, который выглядит так, как вы хотите и так же быстро, как код, который вы использовали.

Если вы напишете в директиве препроцессора замену тега атрибута блоком использования, вы в значительной степени получите лучшее из обоих миров. Этого, вероятно, также можно достичь с помощью скрипта, который запускается поверх вашего исходного кода.

...