表单认证通过WCF(我如何使会话适用于浏览器?!)
本文关键字:适用于 会话 浏览器 何使 认证 WCF 表单 | 更新日期: 2023-09-27 18:16:23
用户正在对REST WCF服务(我自己的)进行身份验证。凭据通过带有Javascript和JSON格式的AJAX发送。当通过身份验证时,服务以OK和少量信息(重定向url)回复客户端。
现在,有一个新的方法提供外部认证,我必须创建一个紧凑的代码片段,很容易粘贴&在asp.net代码文件方法中运行。
一个典型的wcf请求可能是这样结束的,http://testuri.org/WebService/AuthenticationService.svc/ExtLogin?cId=197&aId=someName&password=!!pwd
protected void bn_Click(object sender, EventArgs e)
{
WebHttpBinding webHttpBinding = new WebHttpBinding();
EndpointAddress endpointAddress = new EndpointAddress(url);
ContractDescription cd =
ContractDescription.GetContract(typeof(IAuthenticationService));
ServiceEndpoint sep = new ServiceEndpoint(cd);
sep.Behaviors.Add(new WebHttpBehavior());
sep.Address = endpointAddress;
sep.Binding = webHttpBinding;
var resp = new ChannelFactory<IAuthenticationService>(sepREST).CreateChannel();
LoginResult result = resp.ExtLogin(cId, aId, hashPwd);
Response.Redirect(result.RedirectUri);
// I.e. http://testuri.org/Profile.aspx (Require authenticated to visit)
}
我在resp/result对象中收到正确的经过身份验证的答复。所以,沟通很好。当重定向到实际网站时,我没有经过身份验证。我找不到问题所在?如果我把上面的URI(带有效凭据)粘贴到我的web浏览器URL中,然后手动输入URI,我就通过了身份验证。
我花了一天的时间在网上搜索这个,没有成功。
有很多信息,但似乎没有一个适用。
我错过了什么?
我还尝试了另一种方法,但同样的问题仍然存在。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uriWithParameters);
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.ContentType = "application/json";
request.Accept = "application/json";
request.Method = "GET";
string result;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
result = reader.ReadToEnd();
JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer();
LoginResult contact = jsonDeserializer.Deserialize<LoginResult>(result);
Response.Redirect(result.RedirectUri);
我不确定这个答案,但无论如何都会提供它,因为没有其他人发布过:
我认为这是因为已经验证的请求是通过代码发送的请求。当你重定向时,它是一个完全不同的请求——所以仍然没有经过身份验证。
所有的身份验证技术都需要某种方式来维护跨"无状态"请求的身份验证状态=会话cookie或某种身份验证令牌。
无论您从调用身份验证服务返回的令牌是什么,您的网站请求也需要可用-将请求中的令牌转储到cookie中可能是一个选项。
你能看到(在像Fiddler这样的东西中)一个认证令牌作为请求的一部分发送给'RedirectUrl'吗?