通过不同域上的 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的主要内容,如果未能解决你的问题,请参考以下文章