Ошибка 401 при вызове веб-служб Sitefinity WCF

Я начал разработку с Sitefinity 8.1, и мне нужен доступ к веб-службам Sitefinity WCF (например, ~\Sitefinity\Services\Ecommerce\Catalog\ProductService.svc)

Я пытался получить к ним доступ, как и к любой другой веб-службе, но получаю ошибку 401. После поиска в Интернете и на форуме Sitefinity я нашел пару вещей.

  1. Мне необходимо пройти аутентификацию перед использованием служб [1 и 2]

  2. Аутентификация на основе утверждений — это аутентификация по умолчанию.

  3. Для аутентификации используется URL-адрес /Sitefinity/Services/Security/Users.svc/authenticate [1 и 2].

  4. Я также нашел фрагмент, предоставленный Иваном Димитровым, где он кодирует код аутентификации [3]

  5. Client Api бесполезно аутентифицировать и разрешать запрос к веб-сервисам

  6. Для аутентификации требовалась служба STS, и она интегрирована в мою установку Sitefinity [2] «Вам может быть интересно, где находится эта служба STS. По умолчанию логика интегрирована в ваше приложение Sitefinity и находится в папке ~/Sitefinity/SWT. [2]

    Прочитав эту информацию, я адаптировал код, предоставленный Иваном Димитровым [3], и закодировал вызов в ~\Sitefinity\Services\Ecommerce\Catalog\ProductService.svc. А у меня ошибка 401.

«Удаленный сервер вернул ошибку: (401) Неавторизованный» является результатом неправильных учетных данных. Однако я проверил те же учетные данные с помощью Client Api, через класс SecurityManager, и я получил «UserLoggingReason.Succes», поэтому учетные данные верны.

Странный факт, что у меня нет папки ~/Sitefinity/SWT. Может в этом корень моих проблем?

Я использую ASP.NET MVC и выполняю запрос от контроллера веб-API. А это адаптированный Кодекс:

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();
        }
    }
}

(Я также изменил sitefinityHost на свою машину)

Все ли мои 6 предпосылок верны или что-то изменилось?

Что может быть причиной 401?

Спасибо большое,

Ссылки (наиболее релевантные):

[1] Как пройти аутентификацию (http://www.sitefinity.com/blogs/svetlayankova/posts/svetla-yankovas-blog/2011/11/01/getting_started_with_restful_services_in_sitefinity)

[2] Как пройти аутентификацию (http://www.sitefinity.com/blogs/svetla-yankovas-blog/2013/01/02/working-with-restful-services-часть-2-требования-аутентификация-и-проектирование-обслуживания-вызовы)

[3] Код аутентификации (http://www.sitefinity.com/developer-network/forums/general-discussions-/windows-authentication#1655610)


person Nelssen    schedule 18.08.2015    source источник


Ответы (1)


timw255 написал клиент REST для Sitefinity. Он доступен здесь: https://github.com/timw255/timw255.Sitefinity.RestClient

Приведенный ниже метод регистрирует пользователя в том, что он использует RestSharp (очень полезная библиотека)

 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;
        }
    }

Файл: https://github.com/timw255/timw255.Sitefinity.RestClient/blob/master/timw255.Sitefinity.RestClient/SitefinityRestClient.cs

Папка SWT не является реальной папкой файловой системы, это маршрут.

person Jon R.    schedule 26.08.2015