2013-05-14 3 views
6

Я хотел бы получить доступ к listdata.svc (службе sharepoint), расположенной на domainA.contoso.com, из веб-приложения, расположенного на domainB.contoso.com. Аутентификация кажется проблемой.401 при попытке реализовать CORS для SharePoint

При попытке доступа к ListData.svc при вызове JQuery Ajax с включенным CORS сервер возвращает 401. Если я запускаю тот же запрос с страницы .htm, которую я запускаю изнутри SharePoint, вызов работает нормально, так как домен тот же.

SharePoint использует NTLM с отключенной анонимной аутентификацией - я полагаю, что 401 является результатом того, что учетные данные Windows не передаются на сервер SharePoint, но я не могу правильно добавить эти учетные данные в заголовок. Я установил xhrFields: {withCredentials: true}, но это, похоже, не исправляет проблему аутентификации.

Включен CORS, я установил следующие HTTP-заголовка ответа на SharePoint в IIS:

  • Access-Control-Allow-Credentials: истинный
  • Access-Control-Allow-Headers: Происхождение, Content-Type, Accept
  • Access-Control-Allow-Origin: *
  • Access-Control-Request-методы: POST, GET, HEAD, OPTIONS

Аутентификация Windows включена в IIS для моего веб-приложения, и я не установил HTTP-обработчик «OPTIONSVerbHandler» в IIS. Обращение к чтению, похоже, не имеет значения.

JQuery Ajax вызова (из приложения на subdomainB.contoso.com):

$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: listUrl, 
     xhrFields: { withCredentials: true }, 
     crossDomain:true, 
     processData: false, 
     async: true, 
     dataType: "json", 
     converters: { 
      // WCF Data Service .NET 3.5 incorrectly escapes singles quotes, which is clearly 
      // not required (and incorrect) in JSON specs. 
      // http://bugs.jquery.com/ticket/8320?cversion=0&cnum_hist=1 
      "text json": function (textValue) { 
       return jQuery.parseJSON(textValue.replace(/(^|[^\\])\\'/g, "$1'")); 
      } 
     }, 
     success: function (data, status, xhr) { 
      //successFunc(data.d.results); 
      alert("working!"); 
     }, 
     error: function (xhr, status, error) { 
      alert("failure!"); 
     } 
    }); 

HTTP Header и 401 Ответ:

Key Value 
Request OPTIONS /_vti_bin/ListData.svc/Contacts HTTP/1.1 
Accept */* 
Origin http://domainB.contoso.com 
Access-Control-Request-Method GET 
Access-Control-Request-Headers content-type, accept 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) 
Host domainA.contoso.com 
Content-Length 0 
DNT 1 
Connection Keep-Alive 
Cache-Control no-cache 

Key Value 
Response HTTP/1.1 401 Unauthorized 
Server Microsoft-IIS/7.5 
SPRequestGuid 1e33061c-f555-451b-9d69-0d83eff5f5ea 
WWW-Authenticate NTLM 
X-Powered-By ASP.NET 
MicrosoftSharePointTeamServices 14.0.0.4762 
Access-Control-Allow-Headers Origin, Content-Type, Accept 
Access-Control-Allow-Origin * 
Access-Control-Request-Methods POST, GET, HEAD, OPTIONS 
Access-Control-Allow-Credentials true 
Date Wed, 15 May 2013 15:04:51 GMT 
Content-Length 0 
+0

Вы пытались опубликовать это на http://sharepoint.stackexchange.com/ –

ответ

3

Поздний ответ, но я нашел еще одну нить here, которая имеет легкое решение для IIS и которая работала для меня.

В принципе, стандарт CORS указывает, что запрос предварительной проверки не должен отправлять какие-либо данные аутентификации, а значит, 401. В этом потоке есть пример ограничения анонимных запросов на глагол OPTIONS, который позволяет ответить 200 на предполетный (OPTIONS) глагол), но по-прежнему требует аутентификации для других.

0

Я не уверен, что вы имеете в виду по «анонимная аутентификация отключена», но похоже, что именно поэтому вы получаете ответ 401 (Unauthorized). Он не связан с CORS, но сервер сообщает клиенту, что ему требуется имя пользователя и пароль, прежде чем он разрешит доступ.

Попробуйте передавая имя пользователя и пароль для $.ajax() (ПРЕДУПРЕЖДЕНИЕ: это просто, чтобы проверить, если это решит вашу проблему, жестко прописывать такие детали в коде JS это плохая идея):

$.ajax({ 
    crossDomain:true,  
    url: listUrl, 
    username: VALID_USERNAME, 
    password: VALID_PASSWORD, 
    success: function(data){alert("hello json!") }, 
    error: function() { 
    alert("epic fail"); 
    }, 
    dataType:'json' 
}); 
+0

анонимный auth - это один из режимов, отключенных в IIS. Обычно sharepoint использует Windows Auth. – Ray

+0

@ Спасибо за разъяснение :) Я не знаю, влияет ли это на передачу свойств 'username' /' password' в '$ .ajax()'. – robertklep

+0

Я обновил вопрос - используя либо имя пользователя/пароль, либо withCredentials, похоже, не работает. – Ray

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