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?
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
¿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. –
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