通过不同域上的 REST Web 服务进行用户身份验证 - asp.net

Posted

技术标签:

【中文标题】通过不同域上的 REST Web 服务进行用户身份验证 - asp.net【英文标题】:User authentication through REST web service on a different domain - asp.net 【发布时间】:2011-08-05 16:59:23 【问题描述】:

我希望连接到不同域上的 Web 服务以对用户进行身份验证。 Web 服务本身是一个 RESTful 服务,用 Java 编写。数据以 JSON 格式传入和传出。

我最初尝试使用 jQuery 进行连接(见下文)

        function Login()
    
        $.ajax(
        url: "http://www.externaldomain.com/login/authenticate",  
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data: "'emailAddress':'bob@bob.com', 'password':'Password1'", 
        success: LoadUsersSuccess,
            error: LoadUsersError
        );         
    
    function LoadUsersSuccess()
        alert(1);
    
    function LoadUsersError()
        alert(2);
    

但是,在检查 Firebug 时,这会引发 405 Method Not Allowed 错误。

在这个阶段,由于这是我第一次真正使用 Web 服务,我真的只是想知道这是否是最好的做事方式?为了找到解决方案,是否值得坚持使用这种方法,或者我最好尝试找到这个问题的服务器端答案?如果是这样,是否有人可以发布任何示例?

非常感谢

【问题讨论】:

【参考方案1】:

在浏览器中进行跨域 Web 服务调用非常棘手。因为这是一个潜在的安全漏洞,浏览器会阻止这些类型的请求。但是,有一种称为 JSONP 的解决方法。如果你使用JSONP而不是普通的JSON,你应该可以进行跨域请求。

【讨论】:

【参考方案2】:

好的,为了更新我的位置,我在 firebug 和外部服务器上进行了检查,我收到 405 错误的原因是因为我正在执行 Get 而不是 Post。

我需要做的是发送用户名和密码,然后接收一个 GUID,该 GUID 将用于以后的任何请求。我认为在代码中包含'type:post'就足够了,但显然不是。有人知道我在这里可能会出错吗?正如我所说,Web 服务的新手和我从网上查看的任何尝试都没有任何效果。非常感谢

【讨论】:

【参考方案3】:

好的,我解决了这个问题,我通过回到 C# 并在那里而不是使用 jQuery 或 JSONP 来完成它,我使用 Json.Net 来处理接收到的数据。代码如下:

protected void uxLogin_Click(object sender, EventArgs e)

StringBuilder data = new StringBuilder();
data.Append("");
data.Append("'emailAddress': '" + uxEmail.Text + "', ");
data.Append("'password': '" + uxPassword.Text + "'");
data.Append("");

byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString());
string url = System.Configuration.ConfigurationManager.AppSettings["AuthenticationURL"].ToString();

string JSONCallback = string.Empty;
Uri address = new Uri(url);

// Create the web request  
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;

// Set type to POST  
request.Method = "POST";
request.ContentType = "application/json";
// Create a byte array of the data we want to send  

// Set the content length in the request headers  
request.ContentLength = byteData.Length;

// Write data  
using (Stream postStream = request.GetRequestStream())

    postStream.Write(byteData, 0, byteData.Length);


// Get response  
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)

    // Get the response stream  
    StreamReader reader = new StreamReader(response.GetResponseStream());

    // Console application output  
    JSONCallback = reader.ReadToEnd().ToString();



if (!String.IsNullOrEmpty(JSONCallback))

    JObject jObject = JObject.Parse(JSONCallback);
    if ((bool)jObject["loginResult"] == false)
    
        string errorMessage = jObject["errorMessage"].ToString();
        int errorCode = (int)jObject["errorCode"];
    
    else
    
        string idToken = jObject["idToken"].ToString();
        Session["Userid"] = idToken;
        Response.Redirect("~/MyDetails.aspx");
    

else

    uxReturnData.Text = "The web service request was not successful - no data was returned";

还是谢谢:)

【讨论】:

以上是关于通过不同域上的 REST Web 服务进行用户身份验证 - asp.net的主要内容,如果未能解决你的问题,请参考以下文章

多个应用程序上的 SSO 和 REST Api 身份验证

如何在 REST Web 服务中验证用户身份?

如何使用 oauth2 通过 REST Web 服务进行身份验证

在同一域上的不同窗口之间进行通信[重复]

不同域上的 PhoneGap 应用程序和 WCF 服务

在 ASP.NET 中以不同用户身份启动进程