2008-11-10 24 views
6

Recientemente escribí un servicio web para ser utilizado con Silverlight que utiliza la membresía y los roles de ASP.net.HttpContext vacío al llamar al servicio web WCF

Para validar el cliente en el servicio miro el HttpContext.Current.User (que funciona cuando el servicio es llamado desde Silverlight)

Sin embargo, he estado tratando de llamar al mismo servicio de un asp .net postback. Pero cuando paso al servicio, HTTPContext.Current tiene una cadena emplty para el nombre de usuario.

Supongo que hay algo que no estoy haciendo en el archivo web.config que causa que httpContext no se envíe a través del proxy a mi servicio?

Cualquier idea sería apreciada. Necesito poder validar al cliente de alguna manera usando la membresía y los roles de asp.net y hacer que funcione desde un cliente asp.net y un cliente de Silverlight.

+0

¿Puede explicarnos un poco más acerca de dónde provienen las llamadas ASP.NET? ¿Está en el mismo contexto que el servicio? ¿Los está forzando a iniciar sesión en el sitio antes de acceder al servicio? – Bryant

+0

Se registran en el sitio (aunque pueden navegar sin iniciar sesión) Llamo al servicio durante una devolución de datos. Puedo ver el HttpContext en la devolución de datos que se rellena con el usuario que inició sesión. Pero en el lado del servicio, HttpContext está vacío. – JSmyth

+0

No sé exactamente qué quiere decir con el mismo contexto, el servicio se aloja en un lugar diferente de la aplicación si eso es lo que quiere decir. – JSmyth

Respuesta

0

Creo que puede ser porque mi servicio wcf está en mi proyecto silverlight.web, y quizás sean más amigables a la hora de compartir.

¿Necesito leer más sobre wcf y crear una mayor separación de preocupaciones al configurar un proyecto de servicio web independiente?

1

En lugar de tratar HttpContext ServiceSecurityContext.Current.PrimaryIdentity

+0

ServiceSecurityContext es nulo - Aunque tengo ¿Para el servicio, tal vez tengo que configurar certificados o algo así? – JSmyth

0

Actualización:

Ok He echado un vistazo a la solicitud HTTP POST utilizando Fiddler

se parece a la aplicación Silverlight es el envío de un " State 'con una cookie de autorización y mi aplicación asp.net no.

Parece que necesito enviar el estado + mi cookie de autorización cuando llamo al servicio. Es posible que tenga que formular una nueva pregunta pronto ...

2

Lo he resuelto!

Parece que, de forma predeterminada, la aplicación Silverlight estaba enviando todas las cookies de los navegadores al servicio. Una de estas cookies es la cookie ".ASPXAUTH" para autenticarse contra la membresía y los roles.

Sin embargo, la aplicación asp.net no enviaba las cookies al servicio. Para enviar la cookie de autorización, utilicé el siguiente código antes de llamar a mi método de servicio web.

using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel)) 
    { 
HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty(); 
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest); 

      HttpCookieCollection cc = Page.Request.Cookies; 
      if (Request.Cookies[".ASPXAUTH"] != null) 
      { 
       HttpCookie aCookie = Request.Cookies[".ASPXAUTH"]; 
       String authcookieValue = Server.HtmlEncode(aCookie.Value); 
       httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue); 

      } 
// Webservice call goes here 
    } 
Cuestiones relacionadas