表单认证通过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);

表单认证通过WCF(我如何使会话适用于浏览器?!)

我不确定这个答案,但无论如何都会提供它,因为没有其他人发布过:

我认为这是因为已经验证的请求是通过代码发送的请求。当你重定向时,它是一个完全不同的请求——所以仍然没有经过身份验证。

所有的身份验证技术都需要某种方式来维护跨"无状态"请求的身份验证状态=会话cookie或某种身份验证令牌。

无论您从调用身份验证服务返回的令牌是什么,您的网站请求也需要可用-将请求中的令牌转储到cookie中可能是一个选项。

你能看到(在像Fiddler这样的东西中)一个认证令牌作为请求的一部分发送给'RedirectUrl'吗?