Я начал разработку с Sitefinity 8.1, и мне нужен доступ к веб-службам Sitefinity WCF (например, ~\Sitefinity\Services\Ecommerce\Catalog\ProductService.svc)
Я пытался получить к ним доступ, как и к любой другой веб-службе, но получаю ошибку 401. После поиска в Интернете и на форуме Sitefinity я нашел пару вещей.
Мне необходимо пройти аутентификацию перед использованием служб [1 и 2]
Аутентификация на основе утверждений — это аутентификация по умолчанию.
Для аутентификации используется URL-адрес /Sitefinity/Services/Security/Users.svc/authenticate [1 и 2].
Я также нашел фрагмент, предоставленный Иваном Димитровым, где он кодирует код аутентификации [3]
Client Api бесполезно аутентифицировать и разрешать запрос к веб-сервисам
Для аутентификации требовалась служба 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)