2009-08-18 4 views
0

У меня есть некоторые методы, которые должны работать в качестве определенной учетной записи службы, так что я нормальная вещь:Пользовательский атрибут .NET для выполнения олицетворения?

public DoSomeWorkAsServiceAccount() { 
    ... 
    // assume I am given tokenHandle 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    ... 
    // do the work here 
    ... 

    impersonatedUser.Undo(); 
} 

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

[Impersonate(tokenHandle)] 
public DoSomeWorkAsServiceAccount() { 
    // do the work 
} 

Так вот мои вопросы:

  1. возможно ли это?
  2. Можете ли вы показать мне что-то, что позволит избежать дублирования кода?

Заранее спасибо.

ответ

2

Я не думаю, что атрибут - лучший способ реализовать такую ​​функцию. По большей части атрибуты просто действуют как метаданные по типам и членам (в стороне от Ориентации). Вам нужно будет написать что-то, чтобы проверить этот атрибут, и перенаправить вызов метода соответственно. Если у вас уже есть АОП код на месте это не должно быть много рутинной работы, но если вы этого не сделаете вы, вероятно, будет гораздо лучше служил чем-то вроде этого:

public void DoWorkAsUser(tokenHandle, Action op) 
{ 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    op(); 

    impersonatedUser.Undo(); 
} 

, а затем вызвать его как это:

DoWorAsUser(token, MyMethod); 

Это позволяет централизовать код олицетворения без возиться с отражением, codeweaving и т.д.

+0

Спасибо за ответ ... Мне жаль, что у нас не было АОП. И BTW, ваш значок потрясающий. –

+0

Добро пожаловать! Я не поместил его в пример, но убедитесь, что вы завернули свой вызов «op» в блок finally try и удалили объекты WindowsIdentity и WindowsImpersonationContext. – akmad

4

У меня нет кода, но вы можете попробовать использовать PostSharp для этого. Вы можете создать OnMethodInvocationAspect, который организует элементы безопасности перед вызовом кода метода. например,

public class ImpersonateAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation(MethodInvocationEventArgs eventArgs) 
    { 
    WindowsIdentity newId = new WindowsIdentity(tokenHandle); 
    WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

    eventArgs.Proceed() // Call the code in the actual method. 

    impersonatedUser.Undo(); 
    } 
} 

Вышеупомянутая информация является полной догадкой, но, предположив ее, я, возможно, дал вам действительный вариант.

+0

Спасибо - я не понял, что атрибуты были только данные, и был необходим рамочный чтобы он «делал вещи». –

Смежные вопросы