2011-02-27 20 views
5

Tengo un servicio web que espera un encabezado soap y devuelve un token de autenticación. Pude publicar el encabezado soap en el servicio web usando jquery. El problema es cómo hago que el navegador envíe el token autenticado en cada solicitud de autorización sobre el servicio web. Su ayuda será muy apreciada. Enlaces Útiles i utilizados son los siguientes: Referencia:SOAP Autenticación a través del servicio web utilizando jQuery

  1. Securing ASP.Net Web Service using SOAP

  2. Calling Webservice from Jquery (Posting SOAP Header)

Código:

function logIn(username, password, token) { 
     var soapMessage = 
     '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \ 
     <soap:Body> \ 
     <SecuredWebServiceHeader xmlns="http://tempuri.org/"> \ 
     <Username>' + username + '</Username> \ 
     <Password>' + password + '</Password> \ 
     <AuthenticatedToken>' + token + '</AuthenticatedToken> \ 
     </SecuredWebServiceHeader> \ 
     </soap:Body> \ 
     </soap:Envelope>'; 

     $.ajax({ 
      url: "http://localhost/wstest/Service.asmx/AuthenticateUser", 
      type: "POST", 
      dataType: "xml", 
      data: soapMessage, 
      complete: endLogin, 
      contentType: "text/xml; charset=\"utf-8\"" 
     }); 

     return false; 
    } 

    function endLogin(xmlHttpRequest, status) { 
     alert(xmlHttpRequest.responseXML) 
    } 

Respuesta

0

si la respuesta proporciona una positiva - enviar ese token de vuelta a su servidor para almacenar en una sesión

0

Tuve la misma situación, al tener que proteger una parte de mi sitio web (servicios web incluidos) con autenticación de formularios y tener también una parte pública sin protección, p. Formularios de inicio de sesión/registro, archivos CSS, archivos JS ...

Resolví el problema de inicio de sesión al designar un servicio web público (no protegido con autenticación de formularios) que puede manejar su función de inicio de sesión.

Su función de inicio de sesión debe tener este aspecto:

[WebMethod(EnableSession=true)] 
[ScriptMethod] 
public ResponseBase<bool> DoLogin(LoginCredentials Credentials) 
{ 
     try 
     { 
      // Perform login with credentials 

      if (loginOK) 
      { 
       FormsAuthentication.SetAuthCookie(/* Your user identification here */, true); 
      } 
      return new ResponseBase<bool> { Code= true}; 
     } 
     catch (Exception _ex) 
     { 
      // Save your log 
      return new ResponseBase<bool> { Message = "Incorrect Login" }; 
     } 
} 

Su cliente recibirá la cookie de autenticación de formularios y su respuesta al inicio de sesión. Luego puede evaluar si el inicio de sesión fue exitoso al evaluar el atributo Código en la respuesta.

La clase ResponseBase tiene el siguiente aspecto:

[Serializable] 
[DataContract] 
public class ResponseBase<T> 
{ 
    /// <summary> 
    /// Return code. 
    /// </summary> 
    [DataMember] 
    public T Code { get; set; } 

    /// <summary> 
    /// Message. 
    /// </summary> 
    [DataMember] 
    public string Message { get; set; } 
} 

Por último, pero no menos importante, os animo a llamar a sus servicios web usando JSON en lugar de XML debido a la ligereza del mensaje con cero cambios en las el código del servidor. Además, en el cliente no tienes que compilar manualmente el mensaje, como en tu ejemplo.

Cuestiones relacionadas