2016-05-11 6 views
0

一部の統合テストを自動化しようとしています。ですから、リールユーザーが何をしているかのように節をするために、UIコントローラをプログラムで呼び出すことができるようにしたいと考えています。さまざまな理由でUIテストスイートを使用したくありません。SAMLトークンのFedAuth Cookieを使用してUIコントローラを呼び出します。

問題は、WIFでWS-FederationセキュリティでSSO Windows認証を使用していることです。設定ではpassiveRedirectEnabled = "true"を使用して、セッションクッキーが存在しないか無効または期限切れになるたびにAD FS STSエンドポイント( "/ adfs/ls /")にリダイレクトされます。結果は、Web.configファイルの "reply"属性で指定されたページに再度リダイレクトされます。

私がFiddlerを見ると、302ステータスの2番目のリダイレクト(AD FS STSから戻ってくる)がブラウザに「Set-Cookie:FedAuth = 77u/PD94bWwg ...」命令を返すことがわかります。 FedAuth Cookieを使用して返信ページが表示され、そこからすべてがOKです。

この動作をエミュレートし、正しいFedAuthクッキーでUIコントローラを呼び出すことができる方法はありますか?いいえSharePointはしてください、これはそれとは関係ありません。

答えて

0

私は最後に、フィドラーで見たものから、ブラウザを模倣するステップを再現することができました。私はコードをここに置いて、あなたの道に沿って助けてくれることを願っています。それは非常にきれいではありません、それはPOCモードでもっとですが、それはまだ助けることができます。リクエストによっては自動リダイレクションを許可しなければならないものもありました。

私の同僚であるドミニクポチエは、そのことについて私を助けてくれました。

//First request to the secured site 
     var request = 
      (HttpWebRequest)WebRequest.Create("https://mysite.mycompany.ca/"); 
     request.Method = "GET"; 
     request.UseDefaultCredentials = true; 
     request.PreAuthenticate = true; 
     request.AllowAutoRedirect = false; 

     var httpResponse = (HttpWebResponse)request.GetResponse(); 

//Redirects to the STS based on the response from the first call, posting the ws-federations infos along 
     request = 
      (HttpWebRequest)WebRequest.Create(httpResponse.Headers["Location"]); 

     request.UseDefaultCredentials = true; 
     request.PreAuthenticate = true; 
     request.Host = "sts.mycompany.ca"; 
     request.AllowAutoRedirect = true; 
     request.UserAgent = 
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 

     var nameValueCollection = new NameValueCollection { { "Cache-Control", "max-age=0" } }; 
     request.Headers.Add(nameValueCollection); 
     nameValueCollection = new NameValueCollection { { "Upgrade-Insecure-Requests", "1" } }; 
     request.Headers.Add(nameValueCollection); 
     nameValueCollection = new NameValueCollection { { "Accept-Encoding", "gzip, deflate, sdch" } }; 
     request.Headers.Add(nameValueCollection); 
     nameValueCollection = new NameValueCollection { { "Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4" } }; 
     request.Headers.Add(nameValueCollection); 

     httpResponse = (HttpWebResponse)request.GetResponse(); 


//Parse the response to get ws-federation infos 
     var responseStream = new StreamReader(httpResponse.GetResponseStream()); 
     var responseData = responseStream.ReadToEnd(); 
     var xmlReader = XmlReader.Create(new StringReader(responseData)); 


     var wa = ""; 
     var wresult = ""; 
     var wctx = ""; 

     while (xmlReader.Read()) 
     { 
      if (xmlReader.GetAttribute("name") == "wa") 
       wa = xmlReader.GetAttribute("value"); 
      if (xmlReader.GetAttribute("name") == "wresult") 
       wresult = xmlReader.GetAttribute("value"); 
      if (xmlReader.GetAttribute("name") == "wctx") 
       wctx = xmlReader.GetAttribute("value"); 
     } 

     httpResponse.Close(); 

//Redirects to the controller method we want to hit 
     request = 
      (HttpWebRequest)WebRequest.Create("https://mysite.mycompany.ca/Home/GetStates"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.AllowAutoRedirect = false; 
     //Add the cookie container to the response so that we can get the FedAuth cookie after the response 
     request.CookieContainer = new CookieContainer(); 

     //Add the ws-federation infos from the last http request to the body of the new request 
     using (var streamWriter = new StreamWriter(request.GetRequestStream())) 
     { 

      if (wa != null) 
      { 
       var waEncoded = HttpUtility.UrlEncode(wa); 
       var wresultEncoded = HttpUtility.UrlEncode(wresult); 
       var wctxEncoded = HttpUtility.UrlEncode(wctx); 
       var urlEncoded = "wa=" + waEncoded + "&wresult=" + wresultEncoded + "&wctx=" + wctxEncoded; 

       streamWriter.Write(urlEncoded); 
       streamWriter.Flush(); 
       streamWriter.Close(); 
      } 
     } 
     request.Referer = httpResponse.ResponseUri.OriginalString; 

     httpResponse = (HttpWebResponse)request.GetResponse(); 
     var cookieContainer = request.CookieContainer; 

//Use the FedAuth cookie that we got from last http call and add it to a new request to the controller and voila ! 
     request = 
      (HttpWebRequest)WebRequest.Create("https://mysite.mycompany.ca/Home/GetStates"); 
     request.Method = "GET"; 
     nameValueCollection = new NameValueCollection { { "X-Requested-With", "XMLHttpRequest" } }; 
     request.Headers.Add(nameValueCollection); 
     //Add the FedAuthCookie from last request 
     request.CookieContainer = cookieContainer; 
     request.Referer = "https://proacces-dev1.universitas.ca/"; 

     httpResponse = (HttpWebResponse)request.GetResponse(); 
     responseStream = new StreamReader(httpResponse.GetResponseStream()); 
     responseData = responseStream.ReadToEnd(); 

     Console.WriteLine(responseData); 
     Console.ReadLine(); 
関連する問題