2011-12-02 67 views
0

用戶正在對REST WCF服務(我自己)進行身份驗證。憑據通過AJAX以Javascript和JSON格式發送。服務回覆一個確定的和很少的信息(重定向url)到客戶端,當驗證。FormsAuthenticate通過WCF(我如何使會話適用於瀏覽器?!)

現在,有一種爲外部認證提供的新方法,並且我必須創建一個緊湊的代碼片段,這些代碼片段很容易粘貼到一個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) 
} 

我收到的響應/結果對象正確驗證答覆。所以,溝通很好。當重定向到實際的網站時,我沒有通過身份驗證。我找不到問題?如果我使用上面的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); 

回答

0

我不知道這個答案,但無論如何都會提供它作爲其他人張貼:

我想這是因爲已認證的要求是通過代碼發送的請求。 當你重定向它是一個完全不同的請求 - 所以還沒有通過身份驗證。

所有身份驗證技術都需要某種方式來維護「無狀態」請求=會話Cookie或某種身份驗證令牌的身份驗證狀態。

無論您從調用身份驗證服務返回的令牌都需要可用於您的網站請求 - 將令牌從請求轉儲到Cookie可能是一種選擇。

你能看到(像Fiddler這樣的東西)auth令牌是作爲'RedirectUrl'請求的一部分發送的嗎?

+0

謝謝你的嘗試。我想到了。當服務器端代碼進行身份驗證時,客戶端(Web瀏覽器)不知道。如果我在url中發出uri請求,那麼它是一個客戶端請求。但是,如何讓客戶端了解服務器端身份驗證? – Independent

+0

我*認爲*您可以將cookie從HttpWebRequest請求中取出並保存到Web瀏覽器請求中 - 但我沒有嘗試過。 –

+0

這真的讓我很難過。這個問題似乎更多地與HttpWebRequest獲得他們自己的會話(並且像其他頁面上的行爲一樣)相關。這意味着當我重定向時會話/ Cookies,來自另一個域的新會話嘗試到達禁區。 – Independent

相關問題