1

Windows 인증 및 사용자 지정 역할 공급자를 사용하면서 동시에 ASP.NET 응용 프로그램에 "Act As"기능을 구현하려고합니다. . 기본적으로 내가 할 수 있기를 원하는 것입니다 :ASP.NET Windows 인증 및 사용자 지정 역할 공급자를 사용할 때 "Act As"기능 구현

  • Windows를 사용하여 인증은 그들이 SQL 허가 정보를 얻을 수있는 사용자 지정 역할 공급자를 사용하여 승인 된 도메인 사용자
  • 있습니다 확인하기 위해 현재 사용자의 도메인 계정을 얻기 위해 서버 데이터베이스.
  • 응용 프로그램의 관리자가 해당 사용자로 실제로 응용 프로그램에 로그인 할 필요없이 다른 사용자의 역할을 수행 할 수있는 기능을 구현합니다.

내가 수행하려고하는 시나리오는 응용 프로그램 관리자가 사용자에게 문제를 돕기 위해 시도하고 해당 사용자로 행동하고 볼 수있는대로 응용 프로그램을 볼 수있는 "동작"단추를 클릭한다는 것입니다. . 따라서 역할 공급자는 현재 사용자가 다른 사용자로 행동하고 현재 사용자 대신 해당 사용자에 대한 사용 권한 정보를 얻는 것을 이해해야합니다.

내 역할은 쿠키를 삭제하고 사용자가 현재 다른 사용자로 가장하고 있음을 나타내는 값을 세션 변수에 추가하는 가장 기능을 구현하는 것이 었습니다. 그러나 권한 부여가 발생하는 시점에 세션이 채워지지 않으므로이를 수행 할 수 없습니다. admins 컴퓨터에서 잠재적으로 영구적 인 상태가되는 것을 원하지 않으므로 쿠키를 사용하고 싶지 않습니다 (관리자가 다른 창을 열어 다른 사용자로 행동하거나 자신의 데이터를 볼 수 없음).).

세션을 사용할 수 없다는 가정하에 "사용자로 행동 ..."정보를 저장하는 좋은 방법 (쿠키없이)을 찾을 수 없습니다. .NET에서 제공되는 보안 트리밍을 활용할 수 있도록 역할 제공 업체 등을 사용하고 싶습니다. 이 모든 것은 단순히 불가능할 수도 있지만, 나는 누군가가 이것을 시도했거나 구현하려고 시도 할 수있는 것에 대한 제안을하고 싶습니다.

미리 감사드립니다.

답변

1

비슷한 질문에 대한 내 대답을 참조하십시오 here

그것의 요점은 다음과 같습니다

틀림없이 조금 조잡 내가 이런 짓을하는 방법,의 가장 테이블을 가지고 있었다 내 데이터베이스에 로그온 이름이 인 것으로 가장하고있는 사용자와 사용자의 로그온이 인 것처럼 가장합니다. 사용자가 처음 페이지 (이 Windows 인증을 사용)에 갈 때, 그것은 그 사용자가 테이블에 설정된 가장을 가지고 있는지 확인하고이 사용자 ID를 배치 할 수 있도록

는 좀 재정의 코드를 추가 세션 상태에있는 객체에서. 가장이 없으면 은 실제 사용자 ID를이 동일한 개체에 배치합니다.

그들로 사용자의 데이터에 일을에서 저를 방지하기 위해,이 객체에 두 가지 속성, 내용 커스터마이즈 시스템에서 사용 무엇이다 logon_name, 하나는, 그리고 또 다른 NameForLog 라고, 액션을 로깅 할 때 사용됩니다. 내가 만든 모든 작업이 로 기록됩니다.

사용자 맞춤 콘텐츠를 표시하는 사이트의 모든 영역은 이 세션 개체이므로 가장 된 ID와 을 항상 사용하므로 사용자가보고있는 내용을 항상 보여줍니다. 첫 번째 페이지와 로깅 코드를 넘어서는 것은 심지어 그것이 나를 다루는 지 알지 못합니다. 이는 입니다.

시나리오에 대한

, 당신은 역할 공급자를 구현하고 가장 된 사용자 플러스 명의 도용 사용자가 전원을 끈의 목적을 위해 가장 기능에 액세스 할 수 있도록 몇 가지 역할에 대한 역할을 반환하는 GetRolesForUser를 오버라이드 (override) 할 수있다.

가장하는 사용자의 역할을 가장 한 사용자의 역할을 반환하여 관리자에게 가장하는 모든 기능과 가장하는 사용자에 대한 액세스 권한을 부여 할 수도 있습니다.이 기능은 유용성에 어느 정도 영향을 미칠지에 따라 달라집니다 특정 시나리오에서 기능의

+0

의견을 보내 주셔서 감사 드리며 지연된 답변을 보내 주셔서 죄송합니다. 이 문제를 해결하기위한 코드를 작성할 수는 있지만 모든 보안 기능과 메뉴 보안 기능을 사용자 정의 코드를 처리 할 필요없이 트리밍 할 수있는 방법이 있었으면합니다. 그 조각들. 필자는 본질적으로이 문제를 해결하기 위해 사용자 지정 보안 코드를 개별 페이지 등에 작성하는 것을 피할 수 있기를 바랬습니다. – tonyellard

1

비슷한 것을 구현했습니다 ... 시나리오와 비슷하지만 꽤 가깝습니다.

  1. 관리자 로그인

  2. 이 그런 관리자가 페이지 "클라이언트 선택"로 리디렉션됩니다 (관리자와 같은 하나 개의 역할을한다). 관리자는 ID, 이름 등으로 클라이언트를 검색 할 수 있습니다. 관리자 목록에서 클라이언트를 선택합니다. 클라이언트 ID를 쿠키에 저장합니다.

  3. 내 사용자 지정을 호출하는 사용자 지정 RolesProvider가 있습니다. GetRoles(loggedinUserid);

  4. GetRoles(int loggedinUserId) 방법은 사용자의 유형 즉 관리자인지 비 관리자인지를 결정합니다. 관리자이면 쿠키에서 ClientID를 가져옵니다. loggedInUserID, typdofuser 및 ClientId를 저장된 프로 시저에 전달하면 해당 ClientId의 admin + 모든 역할에 대한 모든 역할을 반환하고 역할 공급자에게 반환됩니다.

이렇게하면 ClientID에 필요한 메뉴뿐 아니라 Admin에 대한 모든 menuitems를 사용할 수 있습니다.

관리자는 언제든지 "클라이언트 선택"페이지로 이동하여 다른 클라이언트로 전환 할 수 있습니다. 고객이 클라이언트를 선택하면 새 ClientId가 쿠키에 저장됩니다.

이제 당신은이 후 두 가지 옵션이 있습니다 HttpCache에 모든 요청에 ​​따라

  1. 당신은 할 수 있습니다 rolesprovider 호출이 또는

  2. 스토어 가져온 역할을하고 클라이언트 ID가 변경 될 때마다이 캐시를 업데이트합니다.

희망이 있습니다.

+0

의견을 보내 주셔서 감사합니다.나는 내가 쿠키가 내가 원했던 것보다 더 끈기가 있기 때문에 피하고 싶었던 점이라고 언급했다. I.E. 이 기능을 브라우저 창/세션에서 계속 유지하는 기능을 원하지 않았습니다. 나는 그것이 현재 세션에만 한정 되길 원했다. 쿠키를 관리한다고해서 원하는 효과를 내지 못합니다. 다른 답변에 대한 내 의견에서 언급했듯이, 페이지 수준 코딩을 피하는 것이 가능하지 않다는 것을 빨리 알게되었습니다. 실제로는 바보입니다. – tonyellard

+0

제 구현을 위해 각 페이지에 코드를 작성할 필요는 없지만 사용자 정의 롤 공급자 (즉, 내장 공급자의 확장자)가 처리합니다. 쿠키를 사용하고 싶지 않으면 모든 요청에 ​​httpcache 또는 db 호출을 사용할 수 있습니다 ... 왜? 관리 사용자가 자신으로 로그인 한 경우 및/또는 사용자로 가장하도록 선택한 경우 추적 할 수있는 방법이 필요하기 때문입니다. 또한 관리자가 완료되면 가장 (impersonation)을 선택 취소 할 수 있습니다. 관리자가 사용자를 변경하면 역할을 업데이트해야합니다. – gbs