使用jQuery进行web服务的SOAP认证

5
我有一个Webservice,需要提供一个soap头并返回身份验证令牌。我已经使用jquery将soap头发布到了webservice上。问题是如何使浏览器在每个请求中发送身份验证令牌,以便在web服务上进行授权。非常感谢您的帮助。我用过的有用链接如下: 参考:
1. 使用SOAP保护ASP.Net Web Service 2. 使用Jquery调用Webservice(发布SOAP头) 代码:
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

我曾经遇到过同样的情况,需要使用表单身份验证来保护我的网站(包括 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服务,因为消息轻量级且服务器代码不需要进行任何更改。此外,在客户端中,您无需像示例中那样手动构建消息。

0
如果响应为正面 - 将该令牌发送回服务器以存储在会话中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接