2015-08-18 15 views
5

zacząłem Rozwijanie z Sitefinity 8.1 i muszę dostęp do WCF Web Services Sitefinity (np ~ \ Sitefinity \ Services \ commerce \ Katalog \ ProductService.svc)Błąd 401 Dzwoniąc z Web Services Sitefinity WCF

Próbowałem uzyskać do nich dostęp, jak każda inna usługa sieci Web, ale dostaję błąd 401. Po wyszukaniu w sieci i forum Sitefinity znalazłem kilka rzeczy.

  1. muszę Uwierzytelnianie Przed używam usług [1 & 2]

  2. Authentication roszczenie oparte jest domyślnym Authentication

  3. Adres URL używany do uwierzytelniania jest/Sitefinity/Usługi /Security/Users.svc/authenticate [1 & 2]

  4. Znalazłem również fragment dostarczony przez Ivana Dymitrowa, w którym koduje kod uwierzytelniający [3 ]

  5. Client Api to bezwartościowy do uwierzytelniania i pozostawić wniosek do usług internetowych

  6. Jego potrzebowała STS uwierzytelniać i jest zintegrowana w moim Sitefinity Montaż [2] „można się zastanawiać, gdzie to STS to. Domyślnie logika jest zintegrowana z aplikacją Sitefinity i można ją znaleźć w ~/Sitefinity/SWT. " [2]

    Po przeczytaniu tej informacji dostosowałem kod podany przez Ivana Dimitrowa [3] i zakodowałem wywołanie do katalogu \ Sitefinity \ Services \ Ecommerce \ Catalog \ ProductService.svc. I mam błąd 401.

„Zdalny serwer zwrócił błąd: (401) Nieuprawnione” jest wynikiem błędnych danych uwierzytelniających, jednak testowałem tych samych danych z API Client, Przez klasy securityManager i uzyskać „UserLoggingReason.Succes” , więc dane uwierzytelniające są poprawne.

Dziwnym faktem jest to, że nie mam żadnego folderu ~/Sitefinity/SWT. Czy to może być przyczyną moich problemów?

Używam ASP.NET MVC, a ja robię żądanie z kontrolera Web Api. i to jest przystosowane Kod:

public static bool AuthenticateRequest(string membershipProvider, string userName, string password, bool rememberMe, ApiController controller) 
{ 

    var jsonData = String.Format(credentialsFormat, membershipProvider, userName, password, rememberMe.ToString().ToLower()); 
    var credentials = Encoding.UTF8.GetBytes(jsonData); 
    string result = InvokeWebMethod(usersServiceUrl, authenticateMethod, "POST", credentials, controller); 
    switch (result) 
    { 
     case "0": 
      return true; 
     default: 
      return false; 
    } 

} 

public static string InvokeWebMethod(string serviceUrl, string methodName, string httpMethod, byte[] data, ApiController controller) 
{ 

    var request = (HttpWebRequest)WebRequest.Create(String.Concat(sitefinityHost, serviceUrl, methodName)); 
    request.Method = httpMethod; 
    request.ContentType = "application/json"; 
    request.CookieContainer = new CookieContainer(); 

    if (cookies != null) 
    { 
     foreach (Cookie cookie in cookies) 
      if (!cookie.Expired) 
       request.CookieContainer.Add(cookie); 
    } 

    if (data != null) 
    { 
     request.ContentLength = data.Length; 
     using (var writer = request.GetRequestStream()) 
     { 
      writer.Write(data, 0, data.Length); 
     } 
    } 


    using (var response = (HttpWebResponse)request.GetResponse()) //The error is here 
    { 
     cookies = response.Cookies; 
     using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) 
     { 
       var cookie = new HttpCookie("customCookie", "cookieVal") 
      { 
       Expires = DateTime.Now.AddDays(1), 
       Domain = controller.Request.RequestUri.Host, 
       Path = "/" 
      }; 
      HttpContext.Current.Response.SetCookie(cookie); 

      return reader.ReadToEnd(); 
     } 
    } 
} 

(ja również Zmieniono sitefinityHost na moim komputerze)

są wszystkie moje 6 lokali poprawnych czy coś się zmieniło?

Co może być przyczyną 401?

Dziękuję bardzo,

Referencje (najbardziej relevants):

[1] Jak uwierzytelniać (http://www.sitefinity.com/blogs/svetlayankova/posts/svetla-yankovas-blog/2011/11/01/getting_started_with_restful_services_in_sitefinity)

[2] Jak uwierzytelnić (http://www.sitefinity.com/blogs/svetla-yankovas-blog/2013/01/02/working-with-restful-services-part-2-claims-authentication-and-designing-service-calls)

[3] Kod uwierzytelniania (http://www.sitefinity.com/developer-network/forums/general-discussions-/windows-authentication#1655610)

Odpowiedz

0

timw255 napisał klienta REST dla Sitefinity. Jest on dostępny tutaj: https://github.com/timw255/timw255.Sitefinity.RestClient

Sposób poniżej użytkownik loguje się on używa RestSharp (bardzo pomaga biblioteki)

private void SignIn() 
    { 
     RestRequest request = new RestRequest("Sitefinity/Authenticate", Method.GET); 

     IRestResponse response = _restClient.Execute(request); 

     switch (response.StatusCode) 
     { 
      case HttpStatusCode.OK: 
       request = new RestRequest("Sitefinity/Authenticate/SWT?realm={realm}&redirect_uri={redirectUri}&deflate=true", Method.POST); 

       request.AddUrlSegment("realm", _baseUrl); 
       request.AddUrlSegment("redirectUri", "/Sitefinity"); 

       request.AddParameter("wrap_name", _username, ParameterType.GetOrPost); 
       request.AddParameter("wrap_password", _password, ParameterType.GetOrPost); 
       request.AddParameter("sf_persistent", "true", ParameterType.GetOrPost); 

       response = _restClient.Execute(request); 

       switch (response.StatusCode) 
       { 
        case HttpStatusCode.OK: 
         if (response.ResponseUri.AbsolutePath == "/Sitefinity/SignOut/selflogout") 
         { 
          SelfLogout(); 
         } 
         break; 
        case HttpStatusCode.Unauthorized: 
         throw new SitefinityException("Invalid username or password"); 
        default: 
         break; 
       } 
       break; 
      case HttpStatusCode.Redirect: 
       throw new NotImplementedException("External STS not supported"); 
      default: 
       break; 
     } 
    } 

Plik: https://github.com/timw255/timw255.Sitefinity.RestClient/blob/master/timw255.Sitefinity.RestClient/SitefinityRestClient.cs

Folder SWT nie jest rzeczywisty plik folder systemowy to trasa.

Powiązane problemy