2016-09-07 3 views
6

WindowsPrincipal의 IsInRole 메서드를 사용하여 WPF 및 Winforms 응용 프로그램의 그룹 구성원을 확인합니다. 난 어떤 AD 사용자 (컴퓨터에 실제로 로그인 한 사용자 일 필요는 없지만, 내가하고있는 일에 따라 필자가 반드시 인증하지 않아도되는 기본 ID 정보 토큰을 사용할 수있는 ID 토큰을 생성하고있다. 나는 그것의 고유 한 이름이 "신원 토큰"이라고 생각한다.)IsInRole 새 보안 토큰 받기

이 코드가 처음으로 특정 컴퓨터에서 실행될 때 운영 체제는 지정된 사용자의 신원 토큰을 생성한다. 그 토큰은 IsInRole 함수에 의해 사용된다. 그룹 멤버쉽의 유효성을 검사하는 것이 빠르기 때문에 정말 좋아하지만 WindowsIdentity/WindowsPrincipal을 만드는 후속 호출은 새 토큰을 만드는 대신 기존 토큰을 참조합니다. 토큰을 업데이트하는 방법을 알고있는 유일한 방법은 컴퓨터 또는 재부팅 (토큰 캐시를 지 웁니다.) 누구든지 캐시 된 ID 토큰을 재설정하는 더 좋은 방법을 알고 있습니까?

예제 코드 C 번호 :

Using System.Security.Principal; 
WindowsIdentity impersonationLevelIdentity = new WindowsIdentity("Some_UserID_That_Isn't_Me", null); 
WindowsPrincipal identityWindowsPrincipal = new WindowsPrincipal(impersonationLevelIdentity); 
If (identityWindowsPrincipal.IsInRole("AN_AD_GROUP")) { ... 

VB :이 문제를 해결할 수 있습니다

Imports System.Security.Principal 
Dim impersonationLevelIdentity = New WindowsIdentity("Some_UserID_That_Isn't_Me", Nothing) 
Dim identityWindowsPrincipal = New WindowsPrincipal(impersonationLevelIdentity) 
if identityWindowsPrincipal.IsInRole("AN_AD_GROUP") then... 

답변

0

내가 밖으로 나왔다. 그것은 캐싱이지만 광고 측면에있는 것으로 보입니다. 결국 새로운 identityWindowsPrincipal을 생성하면 올바른 그룹 멤버쉽으로 업데이트됩니다.

0

확실하지 경우, 직접 또는 간접적으로 WindowsIdentity 클래스의 Dispose 메서드를 호출하려고합니다.

using (WindowsIdentity impersonationLevelIdentity = new WindowsIdentity("Some_UserID_That_Isn't_Me", null)) 
{ 
    // your code 
} 
+0

불행히도 영향을 미치지 않습니다. 그것의 동작에서 보안 토큰이 운영 체제에 의해 저장되고 WindowsPrinciple은 기본적으로 그 개체에 대한 포인터라고 생각합니다. (WindowsPrinciple에는 소멸자가 없습니다.) 따라서 응용 프로그램 실행간에 지속됩니다. 캐시를 없애는 방법을 알고 싶습니다. – Jeff

+0

내가 틀렸어. 그것은 캐싱이지만, 그것이 운영 체제에 있는지 모르겠습니다 - 그것은 광고 측면에있을 수 있습니다. 결국 새로운 identityWindowsPrincipal을 만들면 업데이트 된 (올바른) 그룹 멤버쉽을 얻게됩니다. – Jeff

+0

그런 경우 업데이트 된 결과를 AD로 쿼리 할 때 AD를 직접 쿼리하는 것 외에는 프로그래밍 방식으로 사용할 수있는 솔루션이 없을 수 있습니다. 항상 최신이 아닌 보안 토큰과는 다릅니다. 안타깝게도 광고를 쿼리하는 작업은 느립니다. 적어도 우리 환경에서는 느립니다. – Jeff