2015-04-07 2 views
0

Следующий код был реализован, чтобы получить JsessioniD из Cookies. WebSite использует проверку подлинности.Клиент Odata с Cookie

Вот что я реализовал.

public override void ViewDidLoad() 
    { 
    base.ViewDidLoad(); 
    using(var client= new CookieAwareWebClient()) 
    { 
     var values= new NameValueCollection 
      { 
      {"username","admin"}, 
      {"password","admin"}, 
      }; 
      client.UploadValues("myURL/j_security_check",values); 
      Cookie jSessionID = client.ResponseCookies["JSESSIONID"]; 
      if (jSessionID != null) 
      { 
       // get the JEssionID here 
       string value = jSessionID.Value; 
      } 
    }; 
} 

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
     this.ResponseCookies = new CookieCollection(); 
    } 

    public CookieContainer CookieContainer { get; private set; } 
    public CookieCollection ResponseCookies { get; set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = CookieContainer; 
     return request; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = (HttpWebResponse)base.GetWebResponse(request); 
     this.ResponseCookies = response.Cookies; 
     return response; 
    } 
} 

Я получаю JSessionID, и теперь у меня вопрос, как сделать вызов клиенту odata с заголовком файла cookie?

+0

В чем проблема, которую вы пытаетесь решить? Похоже, вы пытаетесь интегрироваться с приложением ASP.NET с проверкой подлинности форм, это правильно? – timothyclifford

+0

Я пытаюсь получить доступ к веб-странице, которая требует проверки подлинности на основе форм. Я получаю файлы cookie и пытаюсь получить доступ к защищенной одате с добавлением заголовка cookie для получения данных. – casillas

+0

ОК, поэтому вы отправляете заявку на вход в систему, получая файл cookie auth, а затем используя это для будущих запросов? – timothyclifford

ответ

0

У меня нет Xamarin, установленного на этом ПК, чтобы проверить, но должно быть что-то вроде ниже.

Не изменилось много, просто проверяя файл cookie .ASPXAUTH на каждый ответ, и если он существует, сохраняя его. Для каждого запроса, если есть сохраненное значение cookie, это добавляется в запрос.

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    using (var client = new CookieAwareWebClient()) 
    { 
     var values = new NameValueCollection 
     { 
      {"username", "admin"}, 
      {"password", "admin"}, 
     }; 

     // Make call to authenticate 
     client.UploadValues("myURL/j_security_check", values); 

     // Make call to get data or do something as authenticated user 
     var dataYouWant = client.DownloadString("myURL/page_with_data"); 
    } 
} 

public class CookieAwareWebClient : WebClient 
{ 
    private const string COOKIEKEY = ".ASPXAUTH"; 
    public string AspAuthCookieValue { get; set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest) base.GetWebRequest(address); 

     if (!string.IsNullOrEmpty(AspAuthCookieValue)) 
     { 
      request.CookieContainer.Add(new Cookie 
      (
       COOKIEKEY, 
       AspAuthCookieValue 
      )); 
     } 

     return request; 
    } 

    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     var response = (HttpWebResponse) base.GetWebResponse(request); 
     var authCookie = response.Cookies[COOKIEKEY]; 

     if (authCookie != null && !string.IsNullOrEmpty(authCookie.Value)) 
     { 
      AspAuthCookieValue = authCookie.Value; 
     } 

     return response; 
    } 
} 

Не совершенен, но должен дать вам представление о том, что требуется.

UPDATE

Не использовали Simple.OData раньше, но глядя на API, я считаю, вы должны быть в состоянии сделать что-то подобное:

public class GetSomeOData 
{ 
    private const string COOKIEKEY = ".ASPXAUTH"; 
    private string _cookieValue; 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     using (var client = new CookieAwareWebClient()) 
     { 
      var values = new NameValueCollection 
      { 
       {"username", "admin"}, 
       {"password", "admin"}, 
      }; 

      // Make call to authenticate 
      client.UploadValues("myURL/j_security_check", values); 

      _cookieValue = client.AspAuthCookieValue; 

      // Make call to get data or do something as authenticated user 
      var dataYouWant = GetOData(); 
     } 
    } 

    public dynamic GetOData() 
    { 
     var feed = new ODataFeed("http://www.your-odata-url.com"); 
     feed.BeforeRequest += AddCookieToRequest; 
     var db = Database.Opener.Open(feed); 

     return db.SomeData.FindById(1234); 
    } 

    public void AddCookieToRequest(HttpRequestMessage request) 
    { 
     request.Headers.Add("Cookie", String.Format("{0}={1}", COOKIEKEY, _cookieValue)); 
    } 

    public class CookieAwareWebClient : WebClient 
    { 
     public string AspAuthCookieValue { get; set; } 

     protected override WebResponse GetWebResponse(WebRequest request) 
     { 
      var response = (HttpWebResponse)base.GetWebResponse(request); 
      var authCookie = response.Cookies[COOKIEKEY]; 

      if (authCookie != null && !String.IsNullOrEmpty(authCookie.Value)) 
      { 
       AspAuthCookieValue = authCookie.Value; 
      } 

      return response; 
     } 
    } 
} 

Опять же, это не идеально, но должны продемонстрировать как вы получите файл cookie auth, а затем примените его к запросам OData.

+0

Но вы не получаете одату, не так ли? Вы загружаете страницу. – casillas

+0

Да, это просто делает другой запрос на веб-сервер. Можете ли вы рассказать мне, что вы пытаетесь сделать с OData? Вы используете конкретную библиотеку? – timothyclifford

+0

Да Я использую Simple.oData.Client – casillas

Смежные вопросы