通过WCF进行FormsAuthentication(如何使Session适用于浏览器?!)

时间:2011-12-02 13:41:22

标签: c# wcf authentication rest

用户正在对REST WCF服务(我自己的)进行身份验证。凭据通过AJAX以Javascript和JSON格式发送。经过身份验证后,服务会向客户端回复一个OK和小信息(重定向网址)。

现在,为外部身份验证提供了一种新方法,我必须创建一个易于粘贴的紧凑代码片段。在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(使用有效凭据)并粘贴到我的Webbrowser 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);

1 个答案:

答案 0 :(得分:0)

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

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

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

您从调用身份验证服务中获得的任何令牌都需要可用于您的网站请求 - 将请求中的令牌转储到cookie中可能是一种选择。

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