2011-05-05 23 views
25

Acabo de empezar a utilizar WCF Services con ASP.NET AJAX. Instanciando mi servicio WCF desde Javascript y luego paso las variables de cadena como argumentos a mi método de Servicio WCF (con una firma OperationContract). A continuación, devuelvo un objeto .NET (definido con un DataContract) que está vinculado a mi clase Javascript personalizada. Tengo problemas para autenticar en función del usuario que inició sesión en mi sesión web. Sin embargo, el servicio web WCF es un servicio completamente diferente sin contexto para el objeto HttpContext.Current. ¿Cuál es la forma más segura de acceder a ese objeto?access HttpContext.Current from WCF Web Service

Respuesta

44

puede obtener acceso a HttpContext.Current permitiendo AspNetCompatibility, preferiblemente a través de configuración:

<configuration> 
    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    </system.serviceModel> 
</configuration> 

Eso, a su vez, le permite acceder al usuario actual: HttpContext.Current.User, que es lo que busca, ¿no?

Usted puede incluso hacer cumplir AspNetCompatibility por la decoración de su clase de servicio con un atributo adicional: (. En el System.ServiceModel.Activation espacio de nombres)

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 

Si ese atributo está en su lugar, su servicio no podrá iniciarse a menos AspNetCompatibility es habilitado!

+0

Gracias por la entrada. Te di un punto. Marcaré mi respuesta una vez que haya probado esto. Estamos almacenando al usuario de forma ligeramente diferente en nuestra aplicación, por lo que tendremos que rediseñar las cosas como lo recomiendan para la autenticación de formularios. Entonces puedo usar este enfoque. – MacGyver

+0

Vale la pena señalar que esto solo funciona si su servicio está alojado en IIS. –

22

Usted no tiene un HttpContext por defecto, pero que tienen muchos de los mismos objetos presentes en la OperationContext (que siempre está presente) o el WebOperationContext (que sólo está disponible para ciertos enlaces.

Puede acceder a la OperationContext o WebOperationContext mediante el uso de la propiedad estática .Current así: WebOperationContext.Current

+4

+1 Esta debe ser la respuesta aceptada. Estamos tratando con WCF que podría estar alojado en un servicio de Windows o autohospedado. AspNetCompatilibity es solo un viejo hábito. – Askolein

2

En caso de que no quieren cambiar Web.config o no puede cambiarlo:

private string GetClientIPAddress() 
     { 
      var props = OperationContext.Current.IncomingMessageProperties; 
      var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
      if (endpointProperty != null) 
      { 
       if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address)) 
        return "127.0.0.1"; 

       return endpointProperty.Address; 
      } 

      return String.Empty; 
     }