使用jQuery通过Web服务进行SOAP身份验证

时间:2011-02-27 15:09:51

标签: jquery web-services soap forms-authentication

我有一个Web服务,需要一个soap标头并返回一个身份验证令牌。我已设法使用jquery将soap标头发布到web服务。问题是如何使浏览器在每个Web服务授权请求上发送经过身份验证的令牌。你的帮助会很大。我使用的有用链接如下: 参考:

  1. Securing ASP.Net Web Service using SOAP

  2. Calling Webservice from Jquery (Posting SOAP Header)

  3. 代码:

    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)
        }
    

2 个答案:

答案 0 :(得分:0)

如果响应提供肯定 - 将该令牌发送回您的服务器以存储在会话中。

答案 1 :(得分:0)

我有同样的情况,必须使用表单身份验证来保护我的网站的一部分(包括Web服务),并且还有一个不受保护的公共部分,例如登录/注册表单,CSS文件,JS文件...

我通过指定一个可以处理登录功能的公共Web服务(不受表单身份验证保护)解决了登录问题。

您的登录功能应如下所示:

[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" };
        }
}

您的客户端将收到表单身份验证Cookie以及您对登录的响应。稍后,您可以通过评估响应中的Code属性来评估登录是否成功。

ResponseBase类如下所示:

[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; }
}

最后,但并非最不重要的是,我鼓励您使用JSON而不是XML来调用您的Web服务,因为消息的重量轻,服务器代码没有任何变化。另外,在客户端中,您不必像在示例中那样手动构建消息。