2012-02-02 20 views
5

Tengo un ASP.NET application que usa autenticación de bases de reclamos contra ADFS. También lo asigno a un WindowsClaimsIdentity usando las Reclamaciones al Servicio de Identidad de Windows. Eso funciona bienPersonificando ASP.NET reclama identidad a identidad de Windows

Pero ahora tengo que suplantar la solicitud/hilo actual para poder acceder a un servicio que no tenga en cuenta las reclamaciones. ¿Cómo debo hacer eso?

¿Debo adquirido una WindowsImpersonationContext en caso Application_PostAuthenticate y guardar en el que HttpContext.Items y luego en el Application_EndRequest llamada el método de deshacer?

¿O hay otras formas preferidas de hacerlo?

Actualización: Como no recibí ninguna pista sobre cuál es la mejor manera de suplantar intenté con mi propia sugerencia. He creado este código en las global.asax.cs:

private static readonly string WICKey = typeof(System.Security.Principal.WindowsImpersonationContext).AssemblyQualifiedName; 

    protected void Application_PostAuthenticateRequest() 
    { 
     var wid = User.Identity as System.Security.Principal.WindowsIdentity; 
     if (wid != null) 
     { 
      HttpContext.Current.Trace.Write("PostAuthenticateRequest PreImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
      HttpContext.Current.Items[WICKey] = wid.Impersonate(); 
      HttpContext.Current.Trace.Write("PostAuthenticateRequest PostImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
     } 
    } 

    protected void Application_EndRequest() 
    { 
     var wic = HttpContext.Current.Items[WICKey] as System.Security.Principal.WindowsImpersonationContext; 
     if (wic != null) 
     { 
      HttpContext.Current.Trace.Write("EndRequest PreUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
      wic.Undo(); 
      HttpContext.Current.Trace.Write("EndRequest PostUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
     } 
    } 

Cuando miro el registro de seguimiento Veo esto

PostAuthenticateRequest PreImpersonate: NT AUTHORITY\NETWORK SERVICE 
PostAuthenticateRequest PostImpersonate: MyDomain\CorrectUser 
Home: NT AUTHORITY\NETWORK SERVICE 
EndRequest PreUndoImpersonate: NT AUTHORITY\NETWORK SERVICE 
EndRequest PostUndoImpersonate: NT AUTHORITY\NETWORK SERVICE 

Así que en la segunda línea se puede ver el hilo se suplanta correctamente. Pero en las siguientes líneas verá que la suplantación se pierde. (la tercera línea proviene de un controlador).

Cuando uso el siguiente código para suplantar a nivel local que funciona bien:

 var wid = User.Identity as System.Security.Principal.WindowsIdentity; 
     if (wid != null) 
     { 
      using (var ctx = wid.Impersonate()) 
      { 
       //Do something 
      } 
     } 

Pero quiero pasar por toda la solicitud de toda la vida. ¿Cómo debo hacer eso?

Respuesta

1

Dijiste que el servicio de back-end no es consciente de las reclamaciones. ¿Puedes dar más detalles sobre esto? ¿Quiere decir que el código compilado no reconoce las notificaciones, pero tiene la capacidad de modificar el archivo web.config? Si es así, puede intentar configurar el servicio de back-end para usar la interconexión WIF para authN introduciendo cuña en el WSFederationAuthenticationModule, SessionAuthenticationModule y un ClaimsAuthorizationManager personalizado si también necesita realizar authZ. Luego puede usar las funciones ActAs u OnBehalfOf de WIF cuando su aplicación ASP.NET llame al servicio de back-end.

+0

El servicio de back-end usa la Autenticación de Windows y no puedo cambiar nada en su configuración. Además de eso, solo movería el problema, porque ese servicio back-end está accediendo al Servidor SQL con autenticación de Windows suplantada. Entonces tendré que resolver mi problema allí. – Jaap

+0

¿Qué tal algo como [esto] (http://www.syfuhs.net/post/2010/09/09/Converting-Claims-to-Windows-Tokens-and-User-Ipersonation.aspx)? Su aplicación ASP.NET puede suplantar a WindowsPrincipal para ciertos bloques de código donde llama al servicio back-end. –

+0

Quiero suplantar en el evento PostAuthenticateRequest para que la solicitud completa se pueda ejecutar en ese contexto suplantado. Después de suplantar la llamada en PostAuthenticationRequest WindowsIdentity.GetCurrent(). Name devuelve de hecho el nombre de usuario esperado. Pero en mi controlador y después de eso en EndRequest tiene nuevamente la cuenta NetworkService. Y no se hizo un impersonatingcontext.Undo()! – Jaap

-1

Perdón por desenterrar este hilo antiguo, pero para que su código funcione, asegúrese de que el modo de canal administrado del grupo de aplicaciones que ejecuta su aplicación está configurado en clásico.

Cuestiones relacionadas