2010-06-08 3 views
3

내가 사용하여 .NET에서 계정을 사칭 익숙 : 나는 같은 것을 쓸 수 있도록속성을 사용하여 .net을 다른 사용자로 가장 할 수 있습니까?

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

는 .NET의 속성을 정의하는 것이 가능 :이 다음

< runAsUser(someIdentity) > public sub doStuff() 

을하고, .net 프레임 워크는 항상 doStuff() 메서드를 실행할 때 가장합니다.

업데이트 좋아, 나는 속성 생성자에 대한 인수가 사용자의 신원을 전달하는 것을 배제하는 상수 여야하기 때문에 이것이 불가능할 수도 있다고 들었습니다.

조금 다른 점을 물어 보겠습니다. 로그인 한 사용자와 관련된 ID를 반환하는 getUserWindowsIdentity() 함수가 있다고 가정합니다.

doStuff() 메서드를 실행하는 경우 프레임 워크가 항상 getUserWindowsIdentity에 의해 반환 된 사용자 ID를 가장한다고 만들 때 < runAsLoggedInUser) > public sub doStuff() >을 사용할 수 있습니까?

답변

1

나는 이것을 할 수 없다고 확신한다. 당신은 PostSharp으로 시뮬레이션 할 수 있습니다 (또는 이와 유사한.) 상수해야 Attribute 생성자에 전달

매개 변수, 그들은 모두 참조 형식이 될 수 없습니다 것을 의미한다. 코드 블록이 항상 동일한 하드 코딩 된 자격 증명에서 실행되어야하는 유스 케이스에 대해 질문 할 것입니다.

+0

ref 인수를 전달하지 않고도 쉽게 얻을 수있는 경우 특성 클래스를 코드화하여 ID를 조회 할 수 있습니까? –

+0

네,하지만 여전히 속성을 처리하고 실제로 그 코드로 뭔가를 한 다른 코드가 있어야합니다. 일반적으로 속성은 다른 코드에서 반영된 마커로 사용됩니다. 메서드를 호출 한 코드는 특성을로드하고 처리해야하며 실제로 가장을 수행해야합니다. 서로 다른 미리 정의 된 자격 증명을 사용하여 실행해야하는 동일한 위치에서 여러 메서드를 호출하는 경우 잠재적 인 이점을 확인할 수 있습니다. – Toby

2

아니요, 이러한 마법은 .NET 프레임 워크에 없습니다. Reflection을 사용하여 코드를 직접 작성해야 속성을 읽을 수 있습니다. 이 코드는 이미 가지고있는 코드와 비슷하게 보이고 느린 코드는 추가 된 속성을 읽습니다.

+1

그가 존재하는지 물어 보지 않고, 그런 속성/태그를 정의하는 것이 가능하다고 생각합니다. –

0

저는 전문가가 아니므로 제안자가 제안한 방식대로 할 수 없다는 점을 다른 답변자에게 인정 하겠지만, 사용자가 원하는대로 코드를 작성할 수 있습니다. 만큼 빠른 코드를 사용하십시오.

속성 태그를 using 블록으로 바꾸기위한 전처리 지시문을 작성하면 두 가지 장점을 모두 얻을 수 있습니다. 이것은 소스 코드를 통해 실행되는 스크립트로도 가능합니다.

1

doStuff() 메소드를 호출하는 코드 또는 doStuff() 호출자가 doStuff()가 구현 된 객체/클래스에 대한 참조를 얻는 방법을 제어하는 ​​경우, 당신은 당신이 찾고있는 것을 성취 할 수 있습니다. 항목 b)가 선호됩니다.

가능한 경우 동적 프록시를 확인하십시오 (http://www.castleproject.org/dynamicproxy/index.html). 문제의 객체/클래스의 실제 인스턴스를 반환하는 대신 인스턴스에 대한 프록시를 반환합니다. 호출자가 메소드를 호출하면 프록시는 먼저 메소드를 보게됩니다. 프록시의 구현에서 호출되는 메소드에서 속성을 찾고, 발견되면 가장 (impersonation)을 시작합니다.

도니

1

다른 사람이 대답했다, 당신이 "일"을 할 것이다 속성을 작성,하지만 명시 적으로 언급되지 않은 것은 어떤 사용자가 만들 수있는 속성이 없습니다 있다는 것입니다 수있는 런타임 또는 프레임 워크 구성 요소가 사용자를 대신하여 실행됩니다.그래서 당신은 다음과 같은 속성 만들 수 있습니다

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

을 당신은 다음 방법 또는 클래스에 그 속성을 사용할 수

RunAsUserAttribute 클래스의 기능을 호출하기 위해 무슨 일 구성 요소
[RunAsUser] 
public void DoStuff() 
{ 
    // do some stuff as the impersonated user 
} 

? soccerdad가 제안한 동적 프록시에 이러한 종류의 기능을 넣을 수 있습니다. 이것은 문제를 해결하는 한 가지 방법입니다.

건배.

관련 문제